Як працює завершення Bash шляху із судо?


11

Завершення контуру вкладки не працює (принаймні, для Ubuntu та AFAIK Arch) з

sudo mount <whatever>

Ізо-файл, який я намагаюся встановити, не знаходиться /etc/fstab. Якщо я просто набираю

mount <whatever>

завершення працює (але, звичайно, команда не працює, оскільки я не root). Мабуть, саме це 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


4

Це легко вирішити, заглянувши в Arch Wiki :

Корисно мати функцію автоматичного завершення (натискання клавіші Tab двічі на клавіатурі) після введення якоїсь команди, наприклад sudo.

Для цього додайте до свого рядка рядки в такому форматі ~/.bashrc:

заповніть -cf your_command

Наприклад, щоб увімкнути автоматичне завершення після sudoта man:

complete -cf sudo
complete -cf man

Дякую. Зауважте, що автоматичне завершення працює на диво добре у випадку sudo umount. Як зазначає enzotib, ця функція порушена 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 / тощо, щоб знати, які пристрої встановлені та де.

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


Файл, який я намагаюся змонтувати, - це файл iso в моєму домашньому каталозі. Завершення роботи не працює. О, я забув, завершення роботи з монтажу, якщо я не використовую судо. Саме судо його порушує. Будь-які думки?
Алі

Навіть використовуючи абсолютні шляхи? / home / user / myiso <TAB> -> myisofile.iso. налагодження з sudo echo $ SHELL; sudo pwd, сподіваємось, це дасть вам деяку інформацію.
Акі

Так, з абсолютними шляхами. Я спробую налагодити запропоновану вами помилку. Проблема налагодження, яку ви пропонуєте, дає /bin/bash /home/aliяк очікувалося
Алі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.