Przekieruj zarówno stderr, jak i stdout do / dev / null za pomocą / bin / sh


61

Próbowałem różnych sposobów przekierowania zarówno do, jak stdouti bezskutecznie. Mam prawie całe życie bash, z którym nigdy nie miałem tego problemu, ale raz w BSD utknąłem .stderr/dev/null/bin/sh

Co próbowałem:

if ls ./python* 2> /dev/null; then
    echo found Python
fi

... który działa; jeśli Python nie jest obecny, wyciszy komunikaty o błędach z ls. Jeśli jednak python.tgzjest obecny, wypisywany jest wiersz, który wygląda następująco:

# ./test.sh
./python-2.7.3p1.tgz

Próbowałem:

if ls ./python* &> /dev/null; then
    echo found Python
fi

i

if ls ./python* 2>1 > /dev/null; then
    echo found Python
fi

i

if ls ./python* > /dev/null; then
    echo found Python
fi

Nic tak naprawdę nie działa. Mogę przekierować tylko jedno z wyjść, a nie oba jednocześnie.

Odpowiedzi:


102

Będzie to działać w dowolnej powłoce kompatybilnej z Posix:

ls good bad >/dev/null 2>&1

Najpierw musisz przekierować stdout przed skopiowaniem go do stderr ; jeśli najpierw go zduplikujesz, stderr po prostu wskaże, na co wskazywał stdout.

Skrót zawiera także Bash , Zsh i niektóre inne powłoki

ls good bad &>/dev/null

co jest wygodne w wierszu poleceń, ale należy go unikać w skryptach, które mają być przenośne.


1
Rzeczywiście, przeczytałem instrukcję powłoki bourn. Stwierdzono, że nowszych wersjach /bin/shwdrożyły &>/dev/nullskładnią, aparently nie tak albo mam starszą wersję (co nie mogę Echo w jakikolwiek sposób, działa OpenBSD 5.3 tho więc powinno wystarczyć)
Torxed

8
@Torxed, OpenBSD shopiera się na pdksh. Obecnie nie ma już powłoki Bourne'a. cshwprowadzone >&również dostępne w zsh. bashwybrał &>(teraz również obsługiwany przez zshi niektóre pdkshpochodne), choć wyraźnie łamie zgodność z POSIX, ponieważ foo &> filejest to całkowicie poprawna składnia POSIX, co oznacza coś zupełnie innego.
Stéphane Chazelas,

3
@ StéphaneChazelas (...) co oznacza coś zupełnie innego Zostawiłeś mnie zastanawiającego się, co to znaczy w tym przypadku ... :)
Piotr Dobrogost

4
@PiotrDobrogost, foo &> filejest podobny do, foo & > filelub foo & : > filejest uruchamiany foo w tle i otwiera plik do pisania bez żadnej komendy (jest mało prawdopodobne, aby był używany w ten sposób).
Stéphane Chazelas,

5
@PiotrDobrogost, >&nie jest idealny zarówno jako to sprzeczne z >&2, >&-operatorów. zshdodano go dla wygody użytkowników csh (csh nie ma >&2). To tylko cukier syntaktyczny, wystarczy użyć, > file 2>&1który jest standardowy i przenośny (do muszelek Bourne'a).
Stéphane Chazelas,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.