Beim Ausführen von CAT in SCREEN wird keine Ausgabe in die Datei ausgegeben

Beim Ausführen von CAT in SCREEN wird keine Ausgabe in die Datei ausgegeben

Ich versuche, diesen Befehl so zu codieren, dass er zusammen mit zwei anderen auf dem Bildschirm ausgeführt wird, die cateine Datei lesen und sie dann zum Filtern weiterleiten awk. Hier ist der Befehl:

screen -d -m /bin/cat /var/www/html/filter/unfiltered.txt | awk '{print $1}' > /var/www/html/filter/first.txt

Wenn ich den abgetrennten Bildschirm überprüfe, sehe ich, dass er die Liste filtert. Wenn er abgeschlossen ist, wird die Datei first.txterstellt, ist aber leer. Ich habe etwas über die Verwendung von „ -LBildschirm“ für ein Ausgabeprotokoll gelesen, aber ich möchte, dass die Ausgabe in denselben Ordner geht, in dem sich die ungefilterte Liste befindet und aufgerufen wird. first.txtIch kann nicht herausfinden, warum es erfolgreich ausgeführt wird, aber die Ausgabedatei jedes Mal leer ist. Wenn ich es ohne ausführe, screen -d -mist die erstellte Datei nicht leer. Ich glaube, ich übersehe etwas mit dem Bildschirmbefehl. Ich habe gerade angefangen, „Bildschirm“ zu verwenden. Ich bin mir nicht sicher, wann ich sonst posten soll.

Antwort1

Der Grund, warum das nicht funktioniert, liegt darin, dass die Shell den Befehl wie folgt in zwei Teile aufteilt:

screen -d -m /bin/cat /var/www/html/filter/unfiltered.txt

awk '{print $1}' >/var/www/html/filter/first.txt

Das screenläuft catauf einem separaten PTY. Es gibt dann keine Ausgabe aufstdoutumleiten an awk.

Wenn Sie möchten, dass die Pipe unter „screen“ ausgeführt wird, müssen Sie sie mit einer anderen Instanz einer Shell gruppieren:

screen -d -m bash -c 'cat /var/www/html/filter/unfiltered.txt | awk "{print $1}" >/var/www/html/filter/first.txt'

Anschließend sollte klar sein, dass dies eine unnötige Verwendung von ist catund der Befehl eigentlich wie folgt vereinfacht werden kann:

screen -d -m bash -c 'awk "{print $1}" </var/www/html/filter/unfiltered.txt >/var/www/html/filter/first.txt'

Beachten Sie, dass ich die Anführungszeichen darin von einfachen in doppelte geändert habe. Dies liegt daran, dass ich einfache Anführungszeichen verwendet habe, um den gesamten Befehl (und insbesondere $1vor einer frühen Auswertung) zu schützen.

verwandte Informationen