Wenn Sie eine Umleitung in Platz für einen Block von Befehlen haben wollen, ohne die Auswirkungen auf die Leistung und andere Nebenwirkungen in einer Subshell beteiligt, steckte es in Klammern:
{
cd /path/to/files/; for each in *; do cat "$each"; echo "######_NEW_FILE_######"; done
} >output.txt
... als Einzeiler, sollten Sie ein ;
vor der schließenden Klammer setzen:
{ cd /path/to/files/; for each in *; do cat "$each"; echo "######_NEW_FILE_######"; done; } >output.txt
Nebenbei bemerkt, es ist cat "$each"
, nicht cat $each
. Wenn Sie eine Datei mit touch '*'
erstellt haben, würden Sie sonst Ihre Ausgabegröße verdoppeln.
Das heißt, das ist in der Tat sehr fast identisch mit:
cd /path/to/files/; for each in *; do cat "$each"; echo "######_NEW_FILE_######"; done >output.txt
..., für die die >output.txt
zum for
Schleife (und nur der Schleife) gilt. Der Unterschied ist also, dass der { ... }
Ansatz auch alle stdout von dem cd
Befehl umleitet (für den es keine geben sollte, es sei denn, Sie haben es mit einem Shell-Funktions-Wrapper oder Ähnlichem neu definiert).
Das heißt:
# this does not redirect the header
cd /path/to/files; echo "header"; for each in *; do cat "$each"; done >output
# this does not redirect the header or the loop
cd /path/to/files; echo "header"; for each in *; do cat "$each"; done; echo footer >output
# this redirects everything
{ cd /path/to/files; echo "header"; for each in *; do cat "$each"; done; echo footer; } >output
Zu groß ?, Sie wollen nicht den gesamten Inhalt dieser Dateien in dieser Datei? –
... Ich meine, es gibt ein paar offensichtliche Bugs, die nicht aufzählen, aber es würde helfen, wenn Sie beschreiben, was genau "zu groß" in diesem Zusammenhang bedeutet. –
Möchten Sie nur das Ergebnis von Echo in der Datei oder den Inhalt dieser Dateien + das Echo Ergebnis? –