(6 odpovědí)
Uzavřeno před 6 lety.
Chtěl bych zabránit tomu, aby můj program posílal stdout a stderr na jakékoli terminály, soubory nebo zařízení. Napadají mě proto tři příkazy, ale nedokážu rozlišit jejich rozdíly. Mohl byste mi prosím vysvětlit význam každého z nich.
# ./run > /dev/null
# ./run > /dev/null 1>&2
# ./run > /dev/null 2>&1
Přijatá odpověď:
# ./run > /dev/null
Toto přesměruje stdout na /dev/null
, ale se stderr to nedělá vůbec nic. Protože jste požádali o přesměrování ze stdout a stderr, nedělá to, co chcete.
# ./run > /dev/null 1>&2
Toto přesměruje stdout na /dev/null
a poté znovu přesměruje stdout (1>
) kamkoli, kam ukazuje stderr (&2
), což je pravděpodobně terminál a je pravděpodobně tam, kam stdout ukazoval, než jste jej přesměrovali. Čistým efektem zde tedy není (pravděpodobně) žádná přesměrování pro stdout, a pokud jde o stderr, stále s tím nic nenaděláte. Takže to také není to, co chcete.
# ./run > /dev/null 2>&1
Toto přesměruje stdout na /dev/null
a poté přesměruje stderr (2>
) kamkoli, kam ukazuje stdout, což je /dev/null
protože jste to právě přesměrovali. Zdá se, že to je to, co chcete.
Nedokážu rozlišit jejich rozdíly.
Ve skutečnosti byste měli být schopni odlišit rozdíly docela snadno. Řekněme ./run
obsahuje toto:
#!/bin/sh
echo stdout
echo stderr >&2
Výsledky by pak měly být následující:
# ./run > /dev/null
stderr
# ./run > /dev/null 1>&2
stdout
stderr
# ./run > /dev/null 2>&1
Rozdíl je jasný!