Как Bash узнает, когда нужно выполнить расширение имени файла?

При использовании шаблона подстановки без кавычек в командной строке оболочка попытается сопоставить его с именами файлов. Если ни одно имя файла не соответствует шаблону, большинство оболочек сохранят нерасширенный шаблон (zsh, который по умолчанию будет жаловаться, как и bashсset -u).

Очевидно, у вас есть какой-то файл, имя которого соответствует *sta*, но не fsta*или *stab. Оболочка расширяет *sta*до имени этого файла, что означает, что шаблон больше не соответствует fstabв /etc.

Решение состоит в том, чтобы использовать одинарные или двойные кавычки вокруг шаблона (и позволить treeвыполнить внутреннее сопоставление с шаблоном ).

3
29.10.2020, 15:05
1 ответ

Завершение табуляции -отличается от расширения имени файла.

Вкладка -завершение— встроенная функция Bash GNU Readline для интерактивных Баш-сеансы. Например, он дополняет переменные (, tryecho $SH<TAB>)и также аргументы команд с именами файлов.

Кроме того, если установлен пакет bash-completion, завершение становится более интеллектуальным для команд, содержащихся в в /usr/share/bash-completion/completions, один из которых ssh-copy-id. Поскольку для флага -iдля ssh-copy-idтребуется файл, Вкладка -завершает файлы. Без -iнет смысла поставлять файл, поэтому завершение не выполняется.

Опять же, это верно только для команд в каталоге completions. Если у вас есть команда foobar, которая не принимает файл в качестве аргумент, Bash все равно завершит работу с файлами, потому что bash-completionпонятия не имеет о foobar.

С другой стороны, расширение имени файла является поведением оболочки POSIX. Такое случается независимо от того, является ли оболочка интерактивной или нет. Пример:ssh-copy-id -x *приводит к тому, что *расширяется до всех файлов в текущем каталоге, команда хочет их или нет.

10
18.03.2021, 22:54

Теги

Похожие вопросы