it-swarm.com.de

Leiten Sie stderr auf stdout in der C-Shell um

Wenn ich den folgenden Befehl in csh ausführe, erhalte ich nichts, aber es funktioniert in bash. Gibt es eine Entsprechung in csh, die den Standardfehler auf standard out umleiten kann?

somecommand 2>&1
57
zdd

Die Shell csh war noch nie für ihre umfassende Fähigkeit bekannt, Dateizugriffsnummern im Umleitungsprozess zu bearbeiten.

Sie können sowohl Standardausgabe als auch Fehler in eine Datei umleiten mit:

xxx >& filename

aber das ist nicht ganz das, wonach Sie gesucht haben, Standardfehler auf die aktuelle Standardausgabe umzuleiten.


Wenn Ihr zugrunde liegendes Betriebssystem jedoch die Standardausgabe eines Prozesses im Dateisystem verfügbar macht (wie es Linux mit /dev/stdout macht), können Sie diese Methode folgendermaßen verwenden:

xxx >& /dev/stdout

Dadurch werden sowohl die Standardausgabe als auch der Standardfehler an dieselbe Stelle wie die aktuelle Standardausgabe verschoben, und zwar genau so, wie Sie es mit der bash-Umleitung 2>&1 getan haben.

Denken Sie jedoch daran, dass dies keine csh -Funktion ist. Wenn Sie unter einem Betriebssystem arbeiten, bei dem die Standardausgabe nicht als Datei verfügbar macht , können Sie diese Methode nicht verwenden.


Es gibt jedoch eine andere Methode. Sie können die beiden Streams zu einem kombinieren, wenn Sie sie mit |& an eine Pipeline senden. Dann müssen Sie nur noch eine Pipeline-Komponente finden, die ihre Daten schreibt Standardeingabe zu seiner Standardausgabe. Falls Ihnen so etwas nicht bekannt ist, ist es genau das, was cat tut, wenn Sie ihm keine Argumente geben. Daher können Sie Ihre Ziele in diesem spezifischen Fall erreichen mit:

xxx |& cat

Natürlich hindert Sie auch nichts daran, bash (vorausgesetzt, es befindet sich irgendwo auf dem System) in einem csh -Skript auszuführen, um Ihnen die zusätzlichen Funktionen zu bieten. Dann können Sie die umfangreichen Weiterleitungen dieser Shell für die komplexeren Fälle verwenden, in denen csh Probleme haben kann.

Lassen Sie uns dies genauer untersuchen. Erstellen Sie zunächst eine ausführbare Datei echo_err, die eine Zeichenfolge in stderr schreibt:

#include <stdio.h>
int main (int argc, char *argv[]) {
    fprintf (stderr, "stderr (%s)\n", (argc > 1) ? argv[1] : "?");
    return 0;
}

Dann ein Kontrollskript test.csh, das es in Aktion zeigt:

#!/usr/bin/csh

ps -ef ; echo ; echo $$ ; echo

echo 'stdout (csh)'
./echo_err csh

bash -c "( echo 'stdout (bash)' ; ./echo_err bash ) 2>&1"

Der echo der PID und der ps sind einfach so, dass Sie sicherstellen können, dass csh dieses Skript ausführt. Wenn Sie dieses Skript ausführen mit:

./test.csh >test.out 2>test.err

(Die anfängliche Umleitung wird von bash eingerichtet, bevor csh mit der Ausführung des Skripts beginnt.) Überprüfen Sie die out/err-Dateien.

test.out:
    UID     PID    PPID  TTY        STIME     COMMAND
    pax    5708    5364  cons0      11:31:14  /usr/bin/ps
    pax    5364    7364  cons0      11:31:13  /usr/bin/tcsh
    pax    7364       1  cons0      10:44:30  /usr/bin/bash

    5364

    stdout (csh)
    stdout (bash)
    stderr (bash)

test.err:
    stderr (csh)

Sie können dort sehen, dass der test.csh -Prozess in der C-Shell ausgeführt wird und dass der Aufruf von bash von dort aus Ihnen die volle Umleitungsfunktion für bash gibt.

Mit dem 2>&1 im Befehl bash können Sie Standardfehler ganz einfach auf die aktuelle Standardausgabe umleiten, ohne vorher zu wissen, wo sich die Standardausgabe gerade befindet .

75
paxdiablo

Ich widerspreche der obigen Antwort und stelle meine eigene zur Verfügung. csh Besitzt diese Fähigkeit und so wird es gemacht:

xxx |& some_exec # will pipe merged output to your some_exec 

oder

xxx |& cat > filename

oder wenn Sie nur wollen, dass Streams (zu stdout) zusammengeführt werden und nicht zu einer Datei oder some_exec umgeleitet werden:

xxx |& tee /dev/null
42
bioffe

Wie paxdiablo sagte, können Sie >&, um sowohl stdout als auch stderr umzuleiten. Wenn Sie sie jedoch getrennt haben möchten, können Sie Folgendes verwenden:

(command > stdoutfile) >& stderrfile

... wie oben angegeben, wird stdout zu stdoutfile und stderr zu stderrfile umgeleitet.

35
Chris

Was ist mit nur

xxx >& /dev/stdout

???

4
ChPortos
   xxx >& filename

Oder tun Sie dies, um alles auf dem Bildschirm zu sehen und in Ihre Datei zu verschieben:

  xxx | & tee ./logfile
4
Ryan P