Wie wird Bashs * an ein Programm übergeben?

Wie wird Bashs * an ein Programm übergeben?

Was wird an evince gesendet, wenn ich evince *einen Ordner mit vielen PDFs eingebe? Empfängt evince X Argumente oder werden X Instanzen von evince geöffnet, von denen jede ein Argument (eine einzelne Datei) erhält?

Antwort1

Bash führt in jeder Befehlszeile eine Shell-Erweiterung durch. Eine dieser Erweiterungen istDateinamenerweiterungwelches ersetzt *gemäßMustervergleichRegeln.

Im Falle von evince *ersetzt es *durch den Inhalt des aktuellen Arbeitsverzeichnisses. Der Inhalt umfasst Namen von regulären Dateien, Unterverzeichnissen, Links usw. Dot-Dateien sind ausgeschlossen. Im Wesentlichen das, was Sie erhalten, wenn Sie ausführen ls. In Ihrem Fall Dateinamen von PDFs.

Daher evincewird die Binärdatei von Bash nur einmal ausgeführt, wobei die Argumente alphabetisch geordnete Dateinamen sind, die im aktuellen Arbeitsverzeichnis enthalten sind. Wie Evince den Start danach handhabt, hängt von Evince oder dem Framework oder der Bibliothek ab, von der es abhängt, aber das Barebones-X macht hier nichts Besonderes. Evince oder X wissen nicht einmal, dass es mit ausgeführt wurde *. Beispiel:

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

Wenn Sie wissen möchten, wie *erweitert wird, führen Sie einfach aus echo *. Möglicherweise stellen Sie fest, dass das Asterisk nicht erweitert wird und als Argument für die Befehlsausführung erhalten bleibt, wenn das Arbeitsverzeichnis leer ist (nur Punktdateien enthält).

Wie im verlinkten Bash-Handbuch erwähnt, gibt es eine Reihe von Einstellungen, die dieses Verhalten ändern. Von anderen Shells ganz zu schweigen.

verwandte Informationen