2016-04-26 5 views
2

Mein Benutzer keine Schreibrechte für STDERR haben:Schreibe STDERR nach Dateinamen, auch wenn nicht beschreibbar für den Benutzer

[email protected]:~> readlink -e /dev/stderr 
/dev/pts/19 
[email protected]:~> ls -l /dev/pts/19 
crw--w---- 1 sysuser tty 136, 19 Apr 26 14:02 /dev/pts/19 

Es ist in der Regel kein großes Problem,

echo > /dev/stderr 

nicht mit

-bash: /dev/stderr: Permission denied 

aber übliche Umleitung wie

echo >&2 

funktioniert in Ordnung.

Allerdings muß ich jetzt mit einem 3rd-Party-binären fertig zu werden, die nur dann ausgegeben Anmeldung zu einer bestimmten Datei zur Verfügung stellt:

./utility --log-file=output.log 

Ich mag die Log-Ausgabe direkt in STDERR sehen.

Ich kann es nicht einfach wie --log-file=/dev/stderr aufgrund fehlender Schreibberechtigungen tun. Auf anderen Systemen, auf denen die Schreibberechtigungen gesetzt sind, funktioniert das in Ordnung.

Außerdem muss ich auch die Ausgabe des Prozesses zu STDOUT analysieren, daher kann ich nicht einfach Protokoll an STDOUT senden und dann mit >&2 an STDERR umleiten. Ich habe versucht, das script Dienstprogramm (wo die Umleitung zu /dev/stderr funktioniert ordnungsgemäß), aber es führt auch STDOUT und STDERR zusammen.

+0

Was ist die stderr Shell zu so verbunden, dass es funktioniert? –

+1

Warum ist Ihr stderr so, dass Sie nicht darauf schreiben können? Das ist ungewöhnlich - nicht unmöglich, aber ungewöhnlich. –

+0

Ich stimme Jonathan zu, ich kann den ganzen Tag mit echo>/dev/stderr' sprechen. – SaintHax

Antwort

3

Sie können eine Bash Prozess Substitution verwenden:

./utility --log-file=>(cat>&2) 

Die Substitution auf den Nutzen wie --log-file=/dev/fd/63 erscheinen wird, die geöffnet werden kann. Der Prozess cat erbt FD 2, ohne es zu öffnen, damit es die Weiterleitung durchführen kann.

Ich testete die oben genannten mit chmod -w /dev/stderr und dd if=/etc/issue of=/dev/stderr. Das schlägt fehl, aber der Wechsel zu dd if=/etc/issue of=>(cat>&2) gelingt.

Beachten Sie, dass Ihre Fehlerausgabe mehr Pufferung erleidet, als Sie unbedingt erwarten würden, und nicht synchron mit Ihrer Shell-Eingabeaufforderung. Mit anderen Worten, Ihre Eingabeaufforderung erscheint möglicherweise mit Fehlerausgabe gemischt, die an Ihrem Terminal ankommt, nachdem utility abgeschlossen ist. Das dd Beispiel wird dies wahrscheinlich demonstrieren. Möglicherweise möchten Sie ;wait nach dem Befehl anhängen, um sicherzustellen, dass die cat beendet hat, bevor Sie Ihren PS1 Prompt erscheint: ./utility --log-file=>(cat>&2); wait

Verwandte Themen