Как завершение пути Bash работает с sudo?

11

Завершение пути вкладки не работает (по крайней мере, в Ubuntu и AFAIK Arch) с

sudo mount <whatever>

Файл iso, который я пытаюсь смонтировать, отсутствует /etc/fstab. Если я просто наберу

mount <whatever>

завершение работает (но, конечно, команда терпит неудачу, так как я не root). Видимо, именно sudoэто ломает.

Как можно сделать завершение работы с sudo?

Удивительно, что с

sudo umount <whatever>

Завершение работ. Как это достигается? Это смотрит в /etc/fstab?

Решение: я просто помещаю сценарий оболочки в /usr/local/binэти вызовы sudo mount ...с передаваемыми ему аргументами. Завершение работает при вызове этого скрипта, так как нет sudoв пути.

Али
источник

Ответы:

11

Это не имеет ничего общего с bash, но это зависит от завершений, запрограммированных в пакете bash-completion.

Из некоторых комментариев в файле /etc/bash_completion.d/mount:

# mount(8) completion. This will pull a list of possible mounts out of
# /etc/{,v}fstab, unless the word being completed contains a ':', which
# would indicate the specification of an NFS server. In that case, we
# query the server for a list of all available exports and complete on
# that instead.
#

# umount(8) completion. This relies on the mount point being the third
# space-delimited field in the output of mount(8)
#

Кроме того , вы найдете в главном файле /etc/bash_completionследующего комментария, который явно говорить о mountи umountкомандах:

# A meta-command completion function for commands like sudo(8), which need to
# first complete on a command, then complete according to that command's own
# completion definition - currently not quite foolproof (e.g. mount and umount
# don't work properly), but still quite useful.
#

Обновление :
Комментарий о mountи umountкоманде был удален из bash_completion в фиксации :

_command_offset: Restore compopts used by called command.

This fixes completions that rely on their compopts, most notably
mount(8).
Fixes bash-completion bug #313183.

Выпущено вbash-completion 1.90

enzotib
источник
4

Это можно легко решить, заглянув в Arch Wiki :

Полезно иметь функцию автозаполнения (дважды нажимая клавишу Tab на клавиатуре) после того, как вы наберете какую-нибудь команду, например sudo.

Для этого добавьте строку (ы) в этом формате в ваш ~/.bashrcфайл:

завершить -cf your_command

Например, чтобы включить автозаполнение после sudoи man:

complete -cf sudo
complete -cf man
Wieland
источник
Спасибо. Обратите внимание, что автозаполнение работает на удивление хорошо в случае sudo umount. Как указывает энзотиб, эта функция нарушена, mountи в прошлый раз, когда я проверял, она также была нарушена на Arch.
Али
Я только что попробовал это на Arch и sudo mount / me <TAB> завершает путь к единственному пути, который я настроил, /etc/fstabкоторый начинается с / media.
Виланд
В моем случае файл я пытаюсь установить это не в /etc/fstab. Не могли бы вы проверить это?
Али
0

Нет, это не выглядит в fstab. Завершение Bash ищет команды в пути, псевдонимы в bashrc и / или bash_profile и пути. Так что, если вы наберете что-то вроде sudo mount /mnt/some_folderэтого, следует выполнить автозаполнение. Может быть, когда вы сделали, umountвы были в относительном пути для пункта назначения, и он сделал автозаполнение.

Паткос Чаба
источник
Спасибо. Я уверен, что автозаполнение не работает sudo mount /mnt/some_folder, уверен на 100%. AFAIK это не работает на Arch Linux также. Когда я сделал это, umountя не был в относительном пути к месту назначения.
Али
-1

Я предполагаю, что bash не хочет быть слишком сложным и оставаться переносимым, поэтому они не будут искать в / dev, чтобы предложить завершение операции монтирования.

Однако при вызове umount он может легко просмотреть вывод df / mount / etc, чтобы узнать, какие устройства смонтированы и где.

Может быть, zsh обеспечит завершение для монтирования, черт возьми, zsh, даже автозаполнение при выполнении команды scp ...

Aki
источник
Файл, который я пытаюсь смонтировать, является iso-файлом в моем домашнем каталоге. Завершение не работает. О, я забыл, завершение работы над горами, если я не использую sudo. Это судо, которое ломает это. Есть предположения?
Али
Даже используя абсолютные пути? / home / user / myiso <TAB> -> myisofile.iso. отладка с помощью sudo echo $ SHELL; Надеюсь, это даст вам некоторое представление.
Аки
Да, с абсолютными путями. Я попробую отладку, которую вы предлагаете. Предлагаемая отладка дает /bin/bash /home/aliожидаемый результат.
Али