Как символ * из bash передается в программу?

Как символ * из bash передается в программу?

Когда я печатаю evince *в папке с большим количеством pdf-файлов, что отправляется в evince? Получает ли evince X аргументов или открываются X случаев evince, каждый из которых получает один аргумент (один файл)?

решение1

Bash выполняет расширение оболочки в каждой командной строке. Одно из таких расширений —расширение имени файлакоторый заменяет *согласносопоставление с образцомправила.

В случае evince *, он заменяет *на содержимое текущего рабочего каталога. Содержимое означает имена обычных файлов, подкаталогов, ссылок и т. д. Файлы с точками исключаются. В основном то, что вы получаете при запуске ls. В вашем случае имена файлов PDF.

Таким образом, evinceдвоичный файл выполняется Bash только один раз с аргументами, представляющими собой упорядоченные по алфавиту имена файлов, содержащиеся в текущем рабочем каталоге. То, как Evince обрабатывает его последующий запуск, зависит от Evince или любого фреймворка или библиотеки, от которых он зависит, но barebone-система X не делает здесь ничего особенного. Evince или X даже не знают, что он был выполнен с помощью *. Например:

$ ls -a
. .. .hiddendoc.pdf doc1.pdf doc2.docx otherdoc.pdf somedir
$ evince *
# is equivalent to
$ evince doc1.pdf doc2.docx otherdoc.pdf somedir

Если вы хотите узнать, как *расширяется, просто запустите echo *. Вы можете заметить, что если рабочий каталог пуст (содержит только файлы с точками), звездочка не расширяется и остается аргументом для выполнения команды.

Как упоминалось в руководстве по Bash, есть ряд настроек, которые изменяют это поведение. Не говоря уже о других оболочках.

Связанный контент