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.

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.


+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.


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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.