Wie man tee auf stderr?
Will ich split stdout
so, dass es gedruckt wird sowohl stdout
und stderr
. Das klingt wie ein job für tee
aber die syntax ist umgehen mich -
./script.sh | tee stderr
Natürlich, wie sollte stderr
tatsächlich auf die hier verwiesen wird?
- Du meinst /dev/fd/2?
- Oder
/dev/stderr
? - Es gibt Systeme mit /dev/fd aber ohne die symlinks stderr, stdout. Ich denke, dass schließt Solaris? Ein paar Ausreißer, wie z.B. HP-UX, AIX, Irix nicht über /dev/fd, natürlich, aber alle geistig-Systeme tun.
- Mein bad, Solaris 8 und 9 haben /dev/stderr...
- Wirklich? Solaris 10 hat
/dev/stderr
. Ich habe nicht erlebt ein system mit/dev/fd
dass nicht auch/dev/std{in,out,err}
, aber das bedeutet nicht, dass Sie nicht existieren. Mac OS X 10.7.5 hat beide; Solaris hat beide; Linux hat beides. AIX 6 hat weder; HP-UX 11.00, hat weder. - Möglich dupe mit vielen möglichen Antworten: stackoverflow.com/questions/692000/...
bash
akzeptiert/dev/stderr
als synonym für "standard error", ob die Datei existiert im Dateisystem; es ist ein besonderer Fall.- Bezüglich
/dev/fd/2
und/dev/stderr
; bash-Handbuch auf Umleitungen: Bash verarbeitet mehrere Dateinamen, speziell wenn Sie werden verwendet, Umleitungen, ...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Beachten Sie, dass dies ist abhängig von OS-Unterstützung, keine built-in power in tee, also nicht universal ist (aber funktioniert auf MacOS, Linux, Solaris, FreeBSD, wahrscheinlich noch andere).
open()
).bash
impliziert, dass es akzeptiert/dev/fd/2
als Dateiname für die Datei-Deskriptor-2, auch die Datei system nicht über eine solche Datei.bash
, so dass nicht kommen hier ins Spiel.tee
./dev/fd/2
genau ist. Zum Beispiel, wenn Sie sich alsroot
Ihr Apparat ist im Besitz vonroot
. Dann, wenn Sie den Benutzer zu wechseln, haben Sie keine Berechtigung für den Zugriff/dev/fd/2
./proc/self/fd/2
ist etwas, das vorhanden sein können. in der Tat, auf meinem system [CentOS6]/dev/fd
ist ein symlink auf/proc/self/fd
.Die einzige cross-Plattform-Methode, die ich gefunden, die funktioniert in beiden interaktiven und non-interaktiven shells wird:
Dem argument tee ist eine Datei oder einen Datei-handle. Mit Prozess-substitution wir senden die Ausgabe zu einem Prozess. Im Prozess =Katze=, wir umleiten von stdout nach stderr. Die shell (bash/ksh) ist verantwortlich für die Einrichtung der 1 und 2 file-Deskriptoren.
Öffnet STDERR auf STDOUT und dann entsorgt STDOUT.
/dev/null
.