In Bash.
Ich habe Schwierigkeiten zu bestimmen, was ich verwenden soll?
Alle meine Skripte verwenden ">> / dev / stderr"
an der Bash-Eingabeaufforderung, wenn ich versuche:
echo test >>/dev/stderr
funktioniert
echo test >> /dev/stderr
funktioniert
echo test >/dev/stderr
funktioniert
echo test > /dev/stderr
funktioniert
echo test >>&2
FEHLT!
echo test >> &2
FEHLT!
echo test >&2
funktioniert
echo test > &2
FAILS!
Ich bin bereit, alle meine Skripte zu ändern >&2
.
Es scheint auch einen großen Effekt auf ssh (after su SomeUser
) zu haben, wo >>/dev/stderr
es überhaupt nicht funktioniert (Erlaubnis verweigert), sondern nur >&2
funktioniert.
bash
ssh
io-redirection
stderr
Wassermann-Kraft
quelle
quelle
su
dass das Problem auftritt , aktualisiert die Fragesu -c 'some command'
Befehl wird von/bin/sh
nicht ausgeführtbash
, sodass bash-spezifisches Verhalten (z. B. Simulation/dev/stderr
für Umleitungszwecke, wenn es nicht verfügbar ist) nicht garantiert vorhanden ist.Antworten:
>& n
ist die Shell-Syntax zum direkten Duplizieren eines Dateideskriptors . Dateideskriptor 2 ist stderr; So funktioniert das. Sie können auch andere Dateideskriptoren duplizieren, nicht nur stderr. Sie können den Append-Modus hier nicht verwenden, da das Duplizieren eines Dateideskriptors niemals abgeschnitten wird (selbst wenn Ihr stderr eine Datei ist) und>&
ein Token ist. Deshalb können Sie kein Leerzeichen darin einfügen - aber es>& 2
funktioniert.>> name
ist eine andere zulässige Syntax, wobeiname
ein Dateiname (und das Token>>
) ist. In diesem Fall verwenden Sie den Dateinamen/dev/stderr
, was bei betriebssystemspezifischer Behandlung (unter Linux ist dies ein Symlink zu/proc/self/fd/2
) auch einen Standardfehler bedeutet. Der Append- und der Truncate-Modus machen beide dasselbe, wenn stderr ein Terminal ist, da dies nicht abgeschnitten werden kann. Wenn Ihr Standardfehler jedoch eine Datei ist, wird sie abgeschnitten:Wenn bei
/dev/stderr
over ssh ein Fehler auftritt, hat der Serveradministrator möglicherweise eine Sicherheitsmaßnahme angewendet, die verhindert, dass dieser Symlink funktioniert. (ZB können Sie nicht zugreifen/proc
oder/dev
). Während ich davon ausgehen würde, dass beide Arten von seltsamen Brüchen verursachen, ist die Verwendung der Syntax des doppelten Dateideskriptors ein durchaus vernünftiger (und wahrscheinlich etwas effizienterer) Ansatz. Persönlich bevorzuge ich es.quelle
>>
, danke, um darauf hinzuweisen! Außerdem habe ich einen Schrittsu SomeUser
nach dem Verbinden durch ssh verpasst .bash -c 'echo hi >&2; echo bye >&2' 2>/tmp/foo;cat /tmp/foo
tho nicht abschneiden! (auch mit2>&1 |tee /tmp/foo
) was ist perfekt für die Protokollierung und wird perfekt funktionieren, nachdem ich alles geändert habe>&2
. Ich denke also, nur eine direkte Dateiverwendung/dev/stderr
erlaubt das Abschneiden, nicht der duplizierte Deskriptor, cool thx!Die Fehlerfälle treten auf, weil die Bash-Syntax für die Verwendung
&
in Umleitungen eine einzelne angibt>
und erfordert, dass sie direkt neben dem&
Zeichen vorhanden ist:quelle
Verwenden Sie
'>'
diese'>>'
Option, um umzuleiten (wird abgeschnitten, falls vorhanden) oder (anhängen, falls vorhanden).Verwenden Sie
'>&'
diese Option, um einen Stream zu duplizieren. Wenn Sie beispielsweise eine Standardausgabe UND einen Standardfehler in derselben Datei wünschen, leiten Sie zur Datei um'> output.log'
und machen auch Fehler mit'2>&'
quelle