Das Problem hier ist kein Problem mit der Linux-Umleitung. Vielmehr handelt es sich um ein grundlegendes Missverständnis der Funktionsweise der Pipeline. Die Umleitung funktioniert hier nicht, da nur der Schnitt tatsächlich auf Standard gedruckt wird. stdout für den Befehl echo wurde an das stdin von cut weitergeleitet (das in diesem Fall nicht verwendet wird, da eine Datei angegeben ist).
echo "header line" > output_file && cut -c 1-5 input_file >> output_file
ist das, was Sie wollen, und überhaupt nicht unelegant (ich habe Ihren ;
durch ersetzt, &&
damit der Befehl cut nur ausgeführt wird, wenn der Header erfolgreich geschrieben wurde; auf diese Weise wird er nicht ausgeführt, wenn Sie keine Berechtigungen zum Erstellen oder Schreiben in output_file haben ).
Sie können alles auch in einer Subshell ausführen, z.
(echo "header line"; cut -c 1-5 input_file) > output_file
Dies hat jedoch keinen wirklichen Vorteil. Bei komplexeren Beispielen kann dies zu Problemen führen, wenn Sie nicht mit dem Umfang der Subshell vertraut sind.
Wenn Sie möchten, dass cut stdin an stdout weiterleitet, können Sie Folgendes versuchen:
echo "header line" | cut -c 1-5 - input_file
(Der Bindestrich ist eine gebräuchliche Verknüpfung für stdin)
Dies führt jedoch auch die Schnittoperation für stdin aus (was zu einer Kopfzeile von "Kopfzeile" führt). Es ist schwer zu sagen, ob dies das ist, was Sie wollen oder nicht.
{ .... } > some_file 2>&1
(wird „clobber“ irgendeine_Datei nicht clobber, aber append , um es stattdessen nur das zu ändern.>
In a>>
:{ ... } >> some_file 2>&1
)Nur um die Antworten abzurunden, gibt es exec.
quelle