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 stderrauch nutzen willst :
SomeCommand &> SomeFile.txt
oder dies anhängen:
SomeCommand &>> SomeFile.txt
Wenn Sie beide stderrund 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 2oben genannten)
makeBefehls 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 teeagain 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>&1Leitet STDERR zu STDOUT um, 1>&2leitet STDOUT zu STDERR um und 3>&1leitet Stream 3 zu STDERR um.
sh: 1: Syntax error: "&" unexpectedwenn ich |& teeein Python-Skript auf einem c9.io-Server verwende. Es scheint, dass eine andere Shell verwendet wird. echo $SHELLzeigt /bin/bashund $SHELL --versionzeigt Version 4.3.11 (1) -Release. Ich habe es #!/bin/bashin 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 shund bashauf meinem Server zu sortieren . Vielen Dank.
shund nicht bash(oder vielleicht bashim shModus ...). Sie können überprüfen, was genau Ihr aktueller Shell-Prozess verwendet ps -p $$ -o cmd=, da er echo $SHELLunzuverlä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
teeDies 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
lsund , diese nur dann grepunterstützen --color=auto, wenn es sich bei der Standardausgabe um ein Terminal handelt.
Für cronJobs usw. möchten Sie die Bash-Erweiterungen vermeiden. Die entsprechenden POSIX- shUmleitungsoperatoren 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, cshwas Sie bereits davon überzeugen sollte, dass es eine schlechte Idee ist.
some_command | tee command.logund some_command > command.loghaben das Problem, dass sie die Befehlsausgabe nicht command.login Echtzeit in der Datei speichern.
Um dieses Problem zu vermeiden und die Befehlsausgabe in Echtzeit zu speichern, können Sie unbufferdas expectPaket anhängen .
Beispiel:
sudo apt-get install expect
unbuffer some_command | tee command.log
unbuffer some_command > command.log
Angenommen, log.pyenthält:
import time
print('testing')
time.sleep(100) # sleeping for 100 seconds
du kannst rennen unbuffer python log.py | tee command.logoderunbuffer python log.py > command.log
Weitere Informationen: Wie kann ich eine Befehlsausgabe in Echtzeit in einer Datei speichern?
someCommand 2> someFile.txtundsomeCommand 2>> someFile.txtleitet auchstterrzu someFile.txt