stderr-Umleitung funktioniert nicht in csh

stderr-Umleitung funktioniert nicht in csh

Ich führe den folgenden Befehl aus:

pkg_add emacs-23.4,2.tbz 2> output.log

Die Ausgabe wird immer noch im Terminal angezeigt. Wenn ich drücke , erhalte ich

pkg_add emacs-23.4,2.tbz 2 > output.log

mit einem Leerzeichen vor dem2.

Das habe ich ursprünglich nicht gesagt. Ich versuche

pkg_add emacs-23.4,2.tbz > output.log 2>&1

Wenn ich erneut drücke ,Leerzeichen wurden hinzugefügt.

Warum passiert mir das?

Ich führe csh unter FreeBSD aus.

Antwort1

Ich bin nicht sicher, ob Sie versuchen, STDERR zu verbergen oder auf STDOUT umzuleiten.

So leiten Sie STDOUT in eine Datei um:

pkg_add emacs-23.4,2.tbz > stdout.log

So leiten Sie STDOUT und STDERR in eine Datei um:

pkg_add emacs-23.4,2.tbz > & stdxxx.log

So leiten Sie STDOUT in eine Datei um und verbergen STDERR:

( pkg_add emacs-23.4,2.tbz > stdout.log ) > & /dev/null

So leiten Sie STDOUT zur Konsole um und verbergen STDERR:

( pkg_add emacs-23.4,2.tbz > /dev/tty ) > & /dev/null

So leiten Sie STDOUT zur Konsole und STDERR in eine Datei um:

( pkg_add emacs-23.4,2.tbz > /dev/tty ) > & stderr.log

So leiten Sie STDOUT in eine Datei und STDERR in eine Datei um:

( pkg_add emacs-23.4,2.tbz > stdout.log ) > & stderr.log

EDIT: Der Grund, warum das funktioniert, ist, dass die Aktion in den () zuerst stattfindet. Wenn wir STDOUT umgeleitet haben, ist es also außerhalb der () nicht mehr verfügbar. Damit bleibt uns nur noch STDERR, und das können wir dann nach Wunsch umleiten.

Antwort2

Die 2>-Weiterleitung funktioniert nicht mit csh oder tcsh.

Verwenden Sie den chshBefehl, um Ihre Shell in /bin/sh oder /usr/local/bin/bash zu ändern, um die 2>Stilumleitung zu verwenden.Notiz:Ändern Sie die Root-Shell nicht in /usr/local/bin/bash

csh und tcsh können Standardausgabe und Fehler nicht separat umleiten, >&leiten aber die kombinierte Ausgabe in eine Datei um.

Antwort3

Ich weiß, wie es in Csh geht, aber mit zwei Shells:

csh -c 'SOME_COMMAND 1>/dev/null' |& tee file.txt

Auf diese Weise können Sie umleitennurstderr nach file.txt, ohne stdout – nämlich das, was Sie wollten.

Antwort4

In Bezug auf die Antwort von nikc: Um dasselbe Verhalten wie bei Bourne-Shells zu erreichen, /dev/ttyverwenden Sie anstelle von ein FIFO.

So leiten Sie STDOUT zur Konsole um und verbergen STDERR:

mkfifo stdout
( pkg install -y emacs > stdout ) >& /dev/null & cat stdout

So leiten Sie STDERR zur Konsole um und verbergen STDOUT:

pkg install -y emacs > /dev/null

verwandte Informationen