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 chsh
Befehl, 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/tty
verwenden 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