Antworten:
Ja, es ist möglich, die Ausgabe einfach in eine Datei umzuleiten:
SomeCommand > SomeFile.txt
Oder wenn Sie Daten anhängen möchten:
SomeCommand >> SomeFile.txt
Wenn du das stderr
auch nutzen willst :
SomeCommand &> SomeFile.txt
oder dies anhängen:
SomeCommand &>> SomeFile.txt
Wenn Sie beide stderr
und die Ausgabe auf der Konsole und in einer Datei anzeigen lassen möchten, gehen Sie wie folgt vor :
SomeCommand 2>&1 | tee SomeFile.txt
(Wenn Sie nur die Ausgabe möchten, löschen Sie die 2
oben genannten)
make
Befehls in eine Datei zu bekommen, muss stattdessen diese Syntax verwendet werden: make > someFile.txt 2>&1
(Quelle: linuxquestions.org/questions/linux-newbie-8/… )
Um die Ausgabe eines Befehls in eine Datei zu schreiben, gibt es grundsätzlich 10 häufig verwendete Methoden.
Bitte beachten Sie, dass
n.e.
in der Syntaxspalte "nicht vorhanden" steht.
Es gibt einen Weg, aber es ist zu kompliziert, um in die Säule zu passen. Einen hilfreichen Link finden Sie im Abschnitt Liste.
|| visible in terminal || visible in file || existing
Syntax || StdOut | StdErr || StdOut | StdErr || file
==========++==========+==========++==========+==========++===========
> || no | yes || yes | no || overwrite
>> || no | yes || yes | no || append
|| | || | ||
2> || yes | no || no | yes || overwrite
2>> || yes | no || no | yes || append
|| | || | ||
&> || no | no || yes | yes || overwrite
&>> || no | no || yes | yes || append
|| | || | ||
| tee || yes | yes || yes | no || overwrite
| tee -a || yes | yes || yes | no || append
|| | || | ||
n.e. (*) || yes | yes || no | yes || overwrite
n.e. (*) || yes | yes || no | yes || append
|| | || | ||
|& tee || yes | yes || yes | yes || overwrite
|& tee -a || yes | yes || yes | yes || append
command > output.txt
Der Standardausgabestream wird nur in die Datei umgeleitet und ist im Terminal nicht sichtbar. Wenn die Datei bereits existiert, wird sie überschrieben.
command >> output.txt
Der Standardausgabestream wird nur in die Datei umgeleitet und ist im Terminal nicht sichtbar. Wenn die Datei bereits vorhanden ist, werden die neuen Daten an das Ende der Datei angehängt.
command 2> output.txt
Der Standardfehlerstrom wird nur in die Datei umgeleitet, er ist im Terminal nicht sichtbar. Wenn die Datei bereits existiert, wird sie überschrieben.
command 2>> output.txt
Der Standardfehlerstrom wird nur in die Datei umgeleitet, er ist im Terminal nicht sichtbar. Wenn die Datei bereits vorhanden ist, werden die neuen Daten an das Ende der Datei angehängt.
command &> output.txt
Sowohl die Standardausgabe als auch der Standardfehlerstrom werden nur in die Datei umgeleitet. Im Terminal ist nichts sichtbar. Wenn die Datei bereits existiert, wird sie überschrieben.
command &>> output.txt
Sowohl die Standardausgabe als auch der Standardfehlerstrom werden nur in die Datei umgeleitet. Im Terminal ist nichts sichtbar. Wenn die Datei bereits existiert, werden die neuen Daten an das Ende der Datei angehängt.
command | tee output.txt
Der Standardausgabestream wird in die Datei kopiert und ist im Terminal weiterhin sichtbar. Wenn die Datei bereits existiert, wird sie überschrieben.
command | tee -a output.txt
Der Standardausgabestream wird in die Datei kopiert und ist im Terminal weiterhin sichtbar. Wenn die Datei bereits vorhanden ist, werden die neuen Daten an das Ende der Datei angehängt.
(*)
Bash hat keine Kurzschrift-Syntax, die es erlaubt, nur StdErr an einen zweiten Befehl weiterzuleiten, der hier in Kombination mit tee
again zur Vervollständigung der Tabelle benötigt würde. Wenn Sie so etwas wirklich brauchen, schauen Sie bitte unter "So leiten Sie stderr und nicht stdout?" on Stack Overflow für einige Möglichkeiten, wie dies getan werden kann, z. B. durch Austauschen von Streams oder durch Ersetzen von Prozessen.
command |& tee output.txt
Sowohl die Standardausgabe als auch die Standardfehlerströme werden in die Datei kopiert, während sie im Terminal weiterhin sichtbar sind. Wenn die Datei bereits existiert, wird sie überschrieben.
command |& tee -a output.txt
Sowohl die Standardausgabe als auch die Standardfehlerströme werden in die Datei kopiert, während sie im Terminal weiterhin sichtbar sind. Wenn die Datei bereits vorhanden ist, werden die neuen Daten an das Ende der Datei angehängt.
2>&1
Leitet STDERR zu STDOUT um, 1>&2
leitet STDOUT zu STDERR um und 3>&1
leitet Stream 3 zu STDERR um.
sh: 1: Syntax error: "&" unexpected
wenn ich |& tee
ein Python-Skript auf einem c9.io-Server verwende. Es scheint, dass eine andere Shell verwendet wird. echo $SHELL
zeigt /bin/bash
und $SHELL --version
zeigt Version 4.3.11 (1) -Release. Ich habe es #!/bin/bash
in meinem Python-Skript versucht, aber ich verstehe immer noch sh: 1: Syntax error
. Ich habe das, was ich brauchte, also gebe ich es auf, die Verrücktheit zwischen sh
und bash
auf meinem Server zu sortieren . Vielen Dank.
sh
und nicht bash
(oder vielleicht bash
im sh
Modus ...). Sie können überprüfen, was genau Ihr aktueller Shell-Prozess verwendet ps -p $$ -o cmd=
, da er echo $SHELL
unzuverlässig ist und Ihnen Ihre Anmeldeshell anzeigt. Dabei können Sie ignorieren, ob Sie möglicherweise eine andere Subshell gestartet haben.
Sie können auch verwenden tee
, um die Ausgabe an eine Datei zu senden:
command | tee ~/outputfile.txt
Eine kleine Modifikation wird auch stderr einfangen:
command 2>&1 | tee ~/outputfile.txt
oder etwas kürzer und weniger kompliziert:
command |& tee ~/outputfile.txt
tee
Dies ist nützlich, wenn Sie die Befehlsausgabe erfassen und gleichzeitig live anzeigen möchten .
2>&1
?
Sie können die Befehlsausgabe in eine Datei umleiten:
your_command >/path/to/file
Verwenden Sie Folgendes, um die Befehlsausgabe an eine Datei anzuhängen, anstatt sie zu überschreiben:
your_command >>/path/to/file
Eine zu berücksichtigende Verbesserung -
Verschiedene Skripte fügen Farbcodes in die Ausgabe ein, damit Ihre Protokolldatei nicht überladen wird.
Um dies zu beheben, können Sie das Programm sed verwenden , um diese Codes zu entfernen. Beispiel:
command 2>&1 | sed -r 's/'$(echo -e "\033")'\[[0-9]{1,2}(;([0-9]{1,2})?)?[mK]//g' | tee ~/outputfile.txt
ls
und , diese nur dann grep
unterstützen --color=auto
, wenn es sich bei der Standardausgabe um ein Terminal handelt.
Für cron
Jobs usw. möchten Sie die Bash-Erweiterungen vermeiden. Die entsprechenden POSIX- sh
Umleitungsoperatoren sind
Bash POSIX
------------ --------------
foo &> bar foo >bar 2>&1
foo &>> bar foo >>bar 2>&1
foo |& bar foo 2>&1 | bar
Sie werden feststellen, dass die POSIX-Funktion in gewisser Weise einfacher und unkomplizierter ist. Die &>
Syntax wurde entlehnt, csh
was Sie bereits davon überzeugen sollte, dass es eine schlechte Idee ist.
some_command | tee command.log
und some_command > command.log
haben das Problem, dass sie die Befehlsausgabe nicht command.log
in Echtzeit in der Datei speichern.
Um dieses Problem zu vermeiden und die Befehlsausgabe in Echtzeit zu speichern, können Sie unbuffer
das expect
Paket anhängen .
Beispiel:
sudo apt-get install expect
unbuffer some_command | tee command.log
unbuffer some_command > command.log
Angenommen, log.py
enthält:
import time
print('testing')
time.sleep(100) # sleeping for 100 seconds
du kannst rennen unbuffer python log.py | tee command.log
oderunbuffer python log.py > command.log
Weitere Informationen: Wie kann ich eine Befehlsausgabe in Echtzeit in einer Datei speichern?
someCommand 2> someFile.txt
undsomeCommand 2>> someFile.txt
leitet auchstterr
zu someFile.txt