Nur der letzte Abschlag schreibt in die Datei (mögliche Überschneidung mit dem Exec?)

339
Vulpo

Ich versuche, alle meine Ausgaben umgeleitet zu haben a.out, mit Ausnahme einiger, auf die auch geschrieben werden muss b.out. Ich denke, es wäre gut, wenn man exec auf einem Tee (tee, um auch nach b.out umzuleiten) wäre, aber tee sieht nicht so aus, als hätten sie immer dasselbe Verhalten (nur das letzte scheint zu funktionieren):

#!/bin/bash exec > a.out ls /boot |tee b.out #redirected to a.out only! ls /var |tee b.out #redirected to a.out only! ls /run |tee b.out #redirected to a.out only! ls /home |tee b.out #redirected to a.out and b.out (good) echo "a" #redirected to a.out (good) 

Gleiches für ksh. Bei Info verursacht keine der ls einen Fehler. Warum kann der Tee manchmal die Ausgabe nicht verzerren?

1

1 Antwort auf die Frage

4
Kamil Maciorowski

Jeder teeöffnet sich b.outselbst und überschreibt es selbst. Ganz am Ende sehen Sie nur b.outvom letzten tee(beachten Sie, dass dies unabhängig vom vorherigen ist exec, daher war der ursprüngliche Fragentitel " teeInside exec, Random Redirect Behavior" eher irreführend).

Wenn Sie b.outzwischen tee-s untersuchen, werden Sie feststellen, dass nur die Ausgabe des vorhergehenden teeBefehls enthalten ist. Sie können dies tun, indem Sie Ihre Befehle nacheinander (ohne Weiterleitung zu a.out) eingeben und cat b.outnach jedem Aufruf aufrufen .

Umleitung zu a.outist etwas anders. Wenn Sie von der Shell nur einmal geöffnet werden exec, a.outwird alles, was an sie weitergeleitet wird, angehängt.

Lösung: verwenden tee -a. Von man tee:

-a, --append
an die angegebenen FILEs anhängen, nicht überschreiben

Ich fühle mich schlecht, weil ich nicht einmal die einfachste Regel des Code-Debugging angewendet habe - eine Zeile zur Zeit. Es war auch offensichtlich, dass tee standardmäßig nicht angehängt, sondern überschrieben wurde. Danke, ich werde den Fragetitel wie vorgeschlagen bearbeiten. Vulpo vor 6 Jahren 1