Ich habe Probleme mit der Umleitung in tcsh.
Beachten Sie die folgenden Befehle: vi --version
und vi --xxx
. Nehmen wir an, dies befindet sich auf einem Computer, auf dem vi
die --version
Option unterstützt wird. Die Option --xxx
ist ungültig und vim
sollte daher etwas über anzeigen stderr
.
Aus diesem Grund sollte die Verwendung 2> /dev/null
mit diesen beiden Befehlen eine Ausgabe für den gültigen Fall und keine Ausgabe für den ungültigen Fall ergeben.
Und das ist , was sehe ich in bash, zsh, KSH, und Strich.
$ vi --xxx 2> /dev/null
$ vi --version 2> /dev/null
VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Oct 20 2014 16:09:17)
...
Wenn ich dies jedoch in tcsh versuche, wird in beiden Fällen keine Ausgabe ausgegeben .
$ vi --xxx 2> /dev/null
$ vi --version 2> /dev/null
(there is no output here)
Was geht hier vor sich? Leite ich stderr
falsch um?
Hier ist die Ausgabe von tcsh --version
:
tcsh 6.18.01 (Astron) 2012-02-14 (i686-intel-linux) options wide,nls,dl,al,kan,rh,nd,color,filec
quelle
sh -c 'cmd 2> /dev/null'
2>
ist kein Operator intcsh
, Sie verwenden den>
Operator und übergeben2
als Argument anvi
. Dies scheint in Ordnung zu sein, da beide--xxx
und--version
beendenvi
.Von
tcsh(1)
:Sie können also sowohl stdout als auch stderr
>&
umleiten ( "Diagnoseausgabe" ). Es gibt keinen "offensichtlichen" Weg, nur stderr umzuleiten, und dies ist ein seit langem bestehender Mangel der C-Shell. Eine bekannte Problemumgehung ist:Dies funktioniert, indem stdout
/dev/tty
in einer Subshell auf (das ist das aktuelle tty) umgeleitet wird (die Parens machen dasselbe wie in Borowski-Shells), und die Ausgabe der Subshell (die nur stderr ist, seit wir stdout umgeleitet haben) wird auf umgeleitet/dev/null
(aber dies) kann alles sein, wie eine Datei).Ich weiß nicht, was Ihr Ziel ist, aber in Fällen, in denen Sie nicht sicher sind, welche Shell der Benutzer verwendet, ist es normalerweise am besten, sie explizit festzulegen. Es gibt mehr Muscheln als "bourne and csh", wie z. B. Fische, und es kann auch zu geringfügigen Inkompatibilitäten zwischen verschiedenen Bourne-Muscheln kommen, und / oder einige Konstrukte können in einer Muschel "passieren" und in einer anderen nicht ...
quelle
sh -c 'cmd 2> /dev/null'
dies in allen Schalen der Familien Bourne, csh, rc und fish funktioniert (auf Systemen, in denensh
es sich um eine Bourne-ähnliche Schale handelt).