stderr-Umleitung funktioniert in csh nicht

11

Ich führe den folgenden Befehl aus:

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

Die Ausgabe wird weiterhin im Terminal angezeigt. Wenn ich drücke , bekomme ich

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

mit einem Leerzeichen vor dem2 .

Ich habe das ursprünglich nicht gesagt. ich versuche

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

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

Warum passiert mir das?

Ich verwende csh unter FreeBSD.

Gadgetmo
quelle

Antworten:

11

Die 2> -Umleitung 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. Hinweis: Ändern Sie die Root-Shell nicht in / usr / local / bin / bash

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

Craig
quelle
+1 und ✔. Ich habe die Muscheln mit gewechselt sh.
Gadgetmo
1
@Craig Er läuft pkg_addunter FreeBSD, daher gehe ich davon aus, dass dies für den Root-Benutzer ist (/ bin / csh ist die Standardeinstellung für root unter FreeBSD). In diesem Fall sollten Sie nicht die Shell ändern zu / usr / local / bin / bash. / bin / sh ist akzeptabel. Sie können auch einfach zu einer anderen Shell wechseln, nachdem Sie sich als root angemeldet haben.
James O'Gorman
@ JamesO'Gorman Guter Fang Ich habe meine Antwort aktualisiert.
Craig
20

Ich bin nicht sicher, ob Sie versuchen, STDERR auszublenden oder zu 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 verstecken 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 dies funktioniert, ist, dass die Aktion in den () zuerst erfolgt; Ergo, wenn wir STDOUT umgeleitet haben, ist es außerhalb der () nicht mehr verfügbar. Dies lässt uns nur noch STDERR übrig, und dann können wir das nach Wunsch umleiten.

nikc
quelle
Hallo @nikc, willkommen bei unix.SE. Ihr Kommentar ist nützlich und informativ. Ich würde vorschlagen, Ihre Antwort zu bearbeiten und direkt dort aufzunehmen, damit sie nicht so leicht übersehen wird.
Dr.
1

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

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

Auf diese Weise können Sie nur stderr in die Datei file.txt umleiten , ohne stdout - und zwar genau das, was Sie wollten.

Alexander Samoylov
quelle