(6 Antworten)
Vor 6 Jahren geschlossen.
Ich möchte verhindern, dass mein Programm stdout und stderr an Terminals, Dateien oder Geräte sendet. Dafür fallen mir drei Befehle ein, aber ich kann ihre Unterschiede nicht unterscheiden. Könnten Sie mir bitte die Bedeutung von jedem von ihnen erklären.
# ./run > /dev/null
# ./run > /dev/null 1>&2
# ./run > /dev/null 2>&1
Akzeptierte Antwort:
# ./run > /dev/null
Dadurch wird stdout nach /dev/null
umgeleitet , aber es macht überhaupt nichts mit stderr. Da Sie gebeten haben, von stdout und stderr umzuleiten, macht dies nicht das, was Sie wollen.
# ./run > /dev/null 1>&2
Dadurch wird stdout nach /dev/null
umgeleitet , und dann wird stdout erneut umgeleitet (1>
) dorthin, wo stderr hinzeigt (&2
), was wahrscheinlich das Terminal ist und wo stdout wahrscheinlich hinwies, bevor Sie es umgeleitet haben. Der Nettoeffekt hier ist also (wahrscheinlich) überhaupt keine Umleitung für stdout, und was stderr betrifft, tun Sie immer noch nichts damit. Das ist also auch nicht das, was Sie wollen.
# ./run > /dev/null 2>&1
Dadurch wird stdout nach /dev/null
umgeleitet , und leitet dann stderr (2>
) dorthin, wo stdout hinzeigt, also /dev/null
weil Sie es gerade dorthin umgeleitet haben. Das scheint das zu sein, was Sie wollen.
Ich kann ihre Unterschiede nicht erkennen.
Eigentlich sollten Sie die Unterschiede ganz einfach erkennen können. Sagen wir ./run
enthält dies:
#!/bin/sh
echo stdout
echo stderr >&2
Dann sollten die Ergebnisse wie folgt aussehen:
# ./run > /dev/null
stderr
# ./run > /dev/null 1>&2
stdout
stderr
# ./run > /dev/null 2>&1
Der Unterschied ist deutlich!