Как некоторые команды изменяют критерии автозаполнения с вкладками?

Предположим, что я вхожу в такой каталог:

: mydirectory $ ls

foo.txt 

Это только файл. Если я набираю команду как cat а затем я вставляю в автозаполнение (предположим, что символ is на самом деле является кареткой, а не символом для этой цели) …

: mydirectory $ cat ‸

меняется на (опять: ‸ здесь не символ, а карет) …

: mydirectory $ cat foo.txt ‸

Но для такой команды это не то же самое:

: mydirectory $ tar ‸

При табуляции я вижу варианты автозаполнения:

 A cdrtux 

И когда вы пишете что-то вроде:

: mydirectory $ tar -zxvf ‸

Тогда ничего не автозаполняется.

Мой вопрос : как многие команды изменяют правила автозаполнения в bash?

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

Правила автозаполнения в bash определены в скрипте в /etc/bash_completion и дополняются дополнительными скриптами в /etc/bash_completion.d/ . Эти правила попадают в bash при входе в систему.

bash имеет complete команду, которая позволяет вам легко определять правила для завершения. Чтобы увидеть все уже определенные правила, вы можете запустить complete -p .

Теперь большинство дистрибутивов уже определит эти правила для вас. Таким образом, при вводе tar <TAB> уже существует правило, определенное вашим дистрибутивом, чтобы показать файл, который соответствует шаблону *.tar* и параметры команды tar качестве предложений автозаполнения. Вот почему, когда вы вводите tar , он дает вам варианты A cdrtux , но для tar -zvxf это не так, поскольку после этого не может быть никаких дополнительных параметров. Теперь, если вы выберете файл .tar.gz в этом каталоге, он предложит, что в качестве опции автозаполнения, поскольку следующая вещь после опции f является файлом tar.

По умолчанию /etc/bash_completion не предоставляет параметры в качестве предложений и не фильтрует типы файлов. В этом случае вы также увидите файл foo.txt в качестве предложения для tar .

Вы можете прочитать о создании своих собственных правил здесь: https://debian-administration.org/article/316/An_introduction_to_bash_completion_part_1 и https://debian-administration.org/article/317/An_introduction_to_bash_completion_part_2