Geschweifte Klammer und Tilde Der Kommandozeileninterpreter Bash Prozesssubstitution Inhalt Index


Kommandosubstitution

Manchmal ist es notwendig, die Ausgabe eines Kommandos als Argument einem anderen Kommando zu übergeben oder diese einer Shellvariable zuzuweisen.

Um den Sachverhalt zu demonstrieren legen wir in einem leeren Verzeichnis bsp drei neue Dateien an:

user@sonne> touch bsp/bla{1,2,3}.txt

Ausgehend vom aktuellen Verzeichnis benutzen wir das Kommando find, um alle auf *.txt endenden Dateien im Unterverzeichnis bsp zu finden. Das Ergebnis leiten wir über eine Pipe in die Eingabe von ls:

user@sonne> find ./bsp -name "*.txt" | ls -l
insgesamt 1
drwxr-xr-x    4   user   users        1024  Feb 23 11:17  bsp

Eigentlich hatten wir Angaben zu den von find aufgespürten Dateien erwartet... aber das Kommando ls hat die Eingaben aus der Pipe schlicht ignoriert und nur das aktuelle Verzeichnis betrachtet.

Es gibt einige Kommandos, die die üblichen Gesetze außer Kraft setzen und sich den ihnen übertragenen Aufgaben widersetzen. Aber auch solche Querulanten lassen sich zum Gehorsam bewegen. Das Prinzip lautet Kommandosubstitution:

Welche der beiden Varianten man bevorzugt, ist eine Frage des Geschmacks. Beide liefern dasselbe Ergebnis...


Um das obige Ergebnis zu erzielen, hätte man sich auch des Kommandos xargs bedienen können:

user@sonne> find ./bsp -name "*.txt" | xargs ls -l -rw-r--r--    1   user   users         0  Feb 23 11:17  ./bsp/bla1.txt
-rw-r--r--    1   user   users         0  Feb 23 11:17  ./bsp/bla2.txt
-rw-r--r--    1   user   users         0  Feb 23 11:17  ./bsp/bla3.txt

Der Unterschied ist, dass es sich bei Verwendung von xargs um keine Substitution handelt!


Geschweifte Klammer und Tilde Der Kommandozeileninterpreter Bash Prozesssubstitution Inhalt Index