При использовании шаблона подстановки без кавычек в командной строке оболочка попытается сопоставить его с именами файлов. Если ни одно имя файла не соответствует шаблону, большинство оболочек сохранят нерасширенный шаблон (zsh
, который по умолчанию будет жаловаться, как и bash
сset -u
).
Очевидно, у вас есть какой-то файл, имя которого соответствует *sta*
, но не fsta*
или *stab
. Оболочка расширяет *sta*
до имени этого файла, что означает, что шаблон больше не соответствует fstab
в /etc
.
Решение состоит в том, чтобы использовать одинарные или двойные кавычки вокруг шаблона (и позволить tree
выполнить внутреннее сопоставление с шаблоном ).
Завершение табуляции -отличается от расширения имени файла.
Вкладка -завершение— встроенная функция 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 *
приводит к тому, что *
расширяется до всех файлов в текущем каталоге, команда хочет их или нет.