# 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:

- Mittels ``...``

  `user@sonne> ls -l `find ./bsp -name "*.txt"` -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`

- Mittels `$(...)`

  `user@sonne> ls -l $(find ./bsp -name "*.txt") -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`

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!