Wie leite ich die Ausgabe sowohl auf den Bildschirm als auch auf eine Datei um?

12

Mein Ziel ist es, alle Ausgaben eines Skripts in einem Verzeichnis zu protokollieren, das das Skript erstellen wird.

Zum Beispiel habe ich:

~/.abc.sh::

#! /bin/bash
rails new myapp

Wenn ich renne ...

cd ~/code
. ~/.abc.sh

... das erstellt eine neue Rails-App im Verzeichnis ~/code/myapp.

Wenn Rails eine App erstellt, wird eine ganze Menge Text ausgegeben, den ich erfassen und in einer Protokolldatei in demselben Verzeichnis speichern möchte, in dem der railsBefehl neu erstellt wurde. Ich möchte diesen Text auch im Terminal anzeigen.

Wie mache ich das?

Zabba
quelle

Antworten:

23

Sie können den teeBefehl dafür verwenden:

command | tee /path/to/logfile

Das Äquivalente ohne Schreiben in die Shell wäre:

command > /path/to/logfile

Wenn Sie anhängen ( >>) und die Ausgabe in der Shell anzeigen möchten , verwenden Sie die -aOption:

command | tee -a /path/to/logfile

Bitte beachten Sie, dass die Pipe nur stdout abfängt, Fehler an stderr werden von der Pipe mit nicht verarbeitet tee. Wenn Sie Fehler (von stderr) protokollieren möchten, verwenden Sie:

command 2>&1 | tee /path/to/logfile

Dies bedeutet: Führen Sie commandden stderr-Stream (2) aus und leiten Sie ihn zu stdout (1) um. Das wird mit der teeAnwendung an das Rohr übergeben .

Lekensteyn
quelle
Meinst du ~/.abc.sh | tee <file>? Wenn ja, dann ist das Problem, dass ich nicht weiß, in welchem ​​Verzeichnis das Skript die App erstellen wird, wenn ich sie aufrufe. Woher weiß ich also, was ich im fileArgument angeben soll? (Danke für die tollen Beispiele)
Zabba
@Zabba: Was ist mit dem Erstellen einer temporären Datei und dem anschließenden Verschieben?
Lekensteyn
Ok, das sollte funktionieren :). Wie erstelle ich eine temporäre Datei mit einem zufälligen Namen, die ich dann ausgeben und anschließend an einen gewünschten Ort kopieren kann? Gibt es einen eingebauten Befehl, um einen "temporären Dateinamen" zu erhalten?
Zabba
@Zabba: der Befehl dafür ist mktemp. Siehe die Handbuchseite man mktemp.
Lekensteyn
跪拜, arbeite wie ein Zauber
Sun Junwen
0

scriptstartet eine interaktive Sitzung und protokolliert die gesamte Ausgabe (stdout / stderr usw.) in einer Datei oder führt (mit dem -cParameter) einen Befehl aus und protokolliert die Ausgabe davon.

script -c ~/.abc.sh -f abc.log

Hinweis: In einer interaktiven Sitzung können Sie die Aufzeichnung beenden, indem Sie die Sitzung wie gewohnt beenden (z . B. exitoder Ctrl-D).

Für die Sitzungsaufzeichnung mit Videowiedergabe können Sie auch asciinema ausprobieren .

mwfearnley
quelle