T-Stück ein Skript in sich selbst ablegen

1834
Brydon Gibson

Ich bin mit der Verwendung von tee vertraut und weiß, dass ich die Ausgabe einfach mit protokollieren kann

script.sh | tee file.log 

Ich möchte jedoch eine nahtlose Schnittstelle für den Benutzer. Gibt es eine Möglichkeit, innerhalb von script.sh das T-Stück so auszuführen, als ob es wie oben beschrieben ausgeführt würde? Innerhalb dieses Skripts werden Hunderte von Echos und viele andere Skripts ausgeführt, die einzeln an die Datei angehängt werden könnten.

2

1 Antwort auf die Frage

6
John1024

Lösung 1: exec

Sie können einen exec-Befehl am Anfang des Skripts platzieren:

$ cat script1 #!/bin/bash exec > >(tee file.log) echo one echo two 

Hier ist ein Beispiel für die Ausführung von script1:

$ bash script1 $ one two  $ 

Beachten Sie, dass die Shell-Eingabeaufforderung zurückgegeben wurde, bevor die Ausgabe des Skripts abgeschlossen war. Dies liegt daran, dass die Ausgabe an einen Unterprozess ging und aufgrund von Unstimmigkeiten bei Multitasking nach eigenem Zeitplan abgeschlossen wird. Aus diesem Grund bevorzuge ich die zweite Lösung:

Lösung 2: Gruppierung

Sie können das gesamte Skript in eine Shell-Gruppe {...}einfügen und dann die Ausgabe der Gruppe umleiten:

$ cat script2 #!/bin/bash { echo one echo two } | tee file.log 

Dies kann für beliebig komplexe Skripte erfolgen. Einfach {am Anfang und } | tee file.logam Ende setzen.

Ein Beispiellauf sieht folgendermaßen aus:

$ bash script2 one two $  

Beachten Sie, dass die Ausgabe ordentlich abgeschlossen wird, bevor die Aufforderung zurückgegeben wird.

Der Abschlag funktioniert gut und ich benutze ihn jetzt. Gibt es eine Möglichkeit (mit Datum), um jede Zeile mit diesem Ansatz mit einem Zeitstempel zu versehen? Brydon Gibson vor 7 Jahren 0
@BrydonGibson Versuchen Sie: `... | während Lesen -r Zeile; echo "$ (Datum +% Y-% m-% d-% H:% M:% S)" "$ line"; erledigt | tee file.log` John1024 vor 7 Jahren 0
Das wird auch Zeitstempel sein, nicht wahr? Momentan arbeite ich daran, an einer Named Pipe abzusteigen und dann eine ähnliche Methode wie bei Ihnen zu verwenden. Brydon Gibson vor 7 Jahren 0
Aktualisieren Sie Folgendes: Erstellen Sie eine Named Pipe, erzeugen Sie eine While-Schleife (wie Ihre) im Hintergrund, lesen Sie stattdessen aus einer Named Pipe, DANN das Skript ausführen und die Datei abschliessen. Die Hintergrundschleife wartet auf die Ausgabe an die Pipe und das Skript wird nahtlos ausgeführt. Brydon Gibson vor 7 Jahren 0