Arahkan ulang stderr dan stdout ke / dev / null dengan / bin / sh

61

Saya telah mencoba segala macam cara untuk mengarahkan baik stdoutdan stderruntuk /dev/nulltanpa keberhasilan. Saya memiliki hampir seluruh hidup saya menjalankan bash yang saya belum pernah mengalami masalah ini, tetapi untuk sekali di BSD saya terjebak dengan /bin/sh.

Apa yang saya coba:

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

... yang bekerja; jika Python tidak ada maka akan membisukan pesan kesalahan dari ls. Namun, jika python.tgzada, baris dengan akan ditampilkan yang terlihat seperti ini:

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

Saya sudah mencoba:

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

dan

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

dan

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

Tidak ada yang benar-benar berfungsi. Saya hanya bisa mengarahkan salah satu output, tidak keduanya sekaligus.

Torx
sumber

Jawaban:

102

Ini akan bekerja di semua shell yang kompatibel dengan Posix:

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

Anda harus mengarahkan ulang stdout terlebih dahulu sebelum menggandakannya ke stderr ; jika Anda menduplikatnya terlebih dahulu, stderr hanya akan menunjuk pada apa yang awalnya diarahkan oleh stdout.

Bash , zsh, dan beberapa shell lain juga menyediakan pintasan

ls good bad &>/dev/null

yang nyaman pada baris perintah tetapi harus dihindari dalam skrip yang dimaksudkan untuk portabel.

rici
sumber
1
Memang, saya membaca manual shell bourn. Dinyatakan bahwa versi selanjutnya /bin/shtelah mengimplementasikan &>/dev/nullsintaksis, aparently tidak jadi atau saya memiliki versi yang lebih lama (yang saya tidak bisa gema dengan cara apa pun, menjalankan OpenBSD 5.3 yang seharusnya cukup)
Torxed
8
@Torxed, OpenBSD shdidasarkan pada pdksh. Tidak ada lagi Bourne shell saat ini. cshdiperkenalkan >&juga tersedia di zsh. bashmemilih &>(sekarang juga didukung oleh zshdan beberapa pdkshturunan) meskipun itu jelas melanggar kepatuhan POSIX karena foo &> filesintaks POSIX yang valid yang berarti sesuatu yang sama sekali berbeda.
Stéphane Chazelas
3
@ StéphaneChazelas (...) yang berarti sesuatu yang sangat berbeda. Anda membuat saya bertanya-tanya apa artinya dalam kasus ini ... :)
Piotr Dobrogost
4
@PiotrDobrogost, foo &> fileseperti foo & > fileatau foo & : > file, yang menjalankan foo di latar belakang dan membuka file untuk menulis tanpa perintah sama sekali (tidak mungkin digunakan seperti itu).
Stéphane Chazelas
5
@PiotrDobrogost, >&tidak ideal baik sebagai bertentangan dengan >&2, >&-operator. zshmenambahkannya untuk kenyamanan bagi pengguna csh (csh tidak punya >&2). Mereka hanya gula sintaksis, cukup gunakan > file 2>&1yang standar dan portabel (untuk cangkang mirip Bourne).
Stéphane Chazelas