1603 Stimmen

Wie man die Ausgabe in eine Datei und stdout umleitet

In bash wird durch Aufrufen von foo jegliche Ausgabe dieses Befehls auf der Standardausgabe angezeigt.

Durch Aufrufen von foo > output wird jegliche Ausgabe dieses Befehls in die angegebene Datei umgeleitet (in diesem Fall 'output').

Gibt es eine Möglichkeit, die Ausgabe in eine Datei umzuleiten und sie gleichzeitig auf der Standardausgabe anzuzeigen?

6 Stimmen

Wenn jemand hier gelandet ist, der nach dem Erfassen von Fehlerausgaben in Datei sucht, schauen Sie sich - unix.stackexchange.com/questions/132511/… an.

9 Stimmen

Eine Anmerkung zur Terminologie: Wenn Sie foo > output ausführen, werden die Daten wirklich in stdout geschrieben, und stdout ist die Datei mit dem Namen output. Das bedeutet, dass das Schreiben in die Datei das gleiche ist wie das Schreiben in stdout. Sie fragen, ob es möglich ist, sowohl in stdout als auch in das Terminal zu schreiben.

4 Stimmen

@WilliamPursell Ich bin mir nicht sicher, ob Ihre Klarstellung die Dinge verbessert :-) Wie wäre es damit: OP fragt, ob es möglich ist, die Standardausgabe des aufgerufenen Programms sowohl in eine Datei als auch in die Standardausgabe des aufrufenden Programms zu leiten (letzteres wäre die Standardausgabe, die das aufgerufene Programm erben würde, wenn nichts Besonderes getan würde; d.h. das Terminal, wenn das aufrufende Programm eine interaktive Bash-Sitzung ist). Und vielleicht möchten sie auch die Standardfehlerausgabe des aufgerufenen Programms ähnlich leiten ("jede Ausgabe dieses Befehls" könnte vernünftigerweise so interpretiert werden, dass auch stderr eingeschlossen ist).

18voto

Jackkobec Punkte 4677

In meinem Fall hatte ich den Java-Prozess mit Ausgabeprotokollen. Die einfachste Lösung, um die Ausgabeprotokolle anzuzeigen und sie in die Datei umzuleiten (im Folgenden als Protokolldatei bezeichnet), war:

my_java_process_run_script.sh |& tee logfile

Das Ergebnis war, dass der Java-Prozess mit den Ausgabeprotokollen lief und sie anzeigte, indem sie in die Datei mit dem Namen Protokolldatei gesteckt wurden

7 Stimmen

Vielleicht erwähnen, dass die |& Abkürzung sowohl stdout als auch stderr in den Pipe umleitet (entspricht 2>&1 | ...). Verwenden Sie wahrscheinlich tee -a, um an eine bereits vorhandene Datei anzufügen.

0 Stimmen

Ich habe diesen Befehl mit der Option -a nicht ausprobiert, aber es könnte nützlich sein. Vielen Dank.

10voto

Chuck Phillips Punkte 794

Die Verwendung von tail -f output sollte funktionieren.

6voto

jorfus Punkte 2207

Bonusantwort, da mich dieser Anwendungsfall hierher gebracht hat:

Falls Sie dies als ein anderer Benutzer durchführen müssen

echo "eine Ausgabe" | sudo -u some_user tee -a /some/path/some_file

Beachten Sie, dass das echo als Sie ausgeführt wird und das Schreiben in die Datei als "some_user" erfolgt. Was NICHT funktioniert, ist, wenn Sie das echo als "some_user" ausführen und die Ausgabe mit >> "some_file" umleiten, weil die Dateiumleitung als Sie ausgeführt wird.

Hinweis: Tee unterstützt auch das Anhängen mit dem -a Flag, falls Sie eine Zeile in einer Datei als ein anderer Benutzer ersetzen müssen, könnten Sie sed als der gewünschte Benutzer ausführen.

0 Stimmen

Diese Antwort scheint eine Duplikat zu sein und warum brauchst du sudo dafür?

0 Stimmen

Stellen Sie sich vor, Sie fügen eine Zeile zu einer Konfigurationsdatei hinzu. Die Konfigurationsdatei gehört root. Wenn Sie 'sudo echo "Daten" > /etc/config.cfg' ausführen, wird es fehlschlagen. Dieser Trick ermöglicht es Ihnen, sowohl die Frage zu beantworten (wie leite ich Daten in Konsole und Datei um) als auch als Bonus umzuleiten zu einer von root (oder einem anderen Benutzer) gehörenden Datei.

6voto

Bruno BEAUFILS Punkte 958

Sie können dies für Ihr gesamtes Skript tun, indem Sie etwas wie das am Anfang Ihres Skripts verwenden:

#!/usr/bin/env bash

test x$1 = x$'\x00' && shift || { set -o pipefail ; ( exec 2>&1 ; $0 $'\x00' "$@" ) | tee mylogfile ; exit $? ; }

# tu was auch immer du willst

Dies leitet sowohl die stderr- als auch die stdout-Ausgaben in die Datei namens mylogfile um und lässt alles gleichzeitig nach stdout fließen.

Es werden einige dumme Tricks verwendet:

  • Verwendung von exec ohne Befehl, um Umleitungen einzurichten,
  • Verwendung von tee zur Duplizierung von Ausgaben,
  • Neustart des Skripts mit den gewünschten Umleitungen,
  • Verwendung eines speziellen ersten Parameters (ein einfaches NUL-Zeichen, das durch die spezielle Bash-Notation $'string' angegeben wird), um anzugeben, dass das Skript neu gestartet wird (kein entsprechender Parameter darf von Ihrem Originalwerk verwendet werden),
  • Versuch, den ursprünglichen Exit-Status beim Neustart des Skripts unter Verwendung der Option pipefail beizubehalten.

Hässlich, aber in bestimmten Situationen für mich nützlich.

1voto

kiran sai Punkte 31

< command > |& tee filename # dies wird eine Datei mit dem Namen "filename" erstellen und den Befehlsstatus als Inhalt haben. Wenn die Datei bereits existiert, wird der vorhandene Inhalt entfernt und der Befehlsstatus wird geschrieben.

< command > | tee >> filename # dies wird den Status an die Datei anhängen, aber es druckt den Befehlsstatus nicht auf die Standardausgabe (Bildschirm).

Ich möchte etwas mit "echo" auf dem Bildschirm ausgeben und diese ausgegebenen Daten an eine Datei anhängen

echo "Hallo, hier muss dies auf dem Bildschirm gedruckt und an eine Datei angehängt werden"

0 Stimmen

Ist dies eine weitere Frage?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X