Когда я печатаю 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, есть ряд настроек, которые изменяют это поведение. Не говоря уже о других оболочках.