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
|
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:
Mittels `...`
user@sonne> ls -l `find ./bsp -name "*.txt"`
-rw-r--r-- 1 user users 0 Feb 23 11:17 ./bsp/bla1.txt
|
Mittels $(...)
user@sonne> ls -l $(find ./bsp -name "*.txt")
-rw-r--r-- 1 user users 0 Feb 23 11:17 ./bsp/bla1.txt
|
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
|
Der Unterschied ist, dass es sich bei Verwendung von xargs
um keine
Substitution handelt!