(6 jawaban)
Tutup 6 tahun yang lalu.
Saya ingin mencegah program saya mengirim stdout dan stderr ke terminal, file, atau perangkat apa pun. Untuk ini, saya memiliki tiga perintah yang melintas di benak saya, tetapi saya tidak dapat membedakan perbedaannya. Bisakah Anda menjelaskan arti masing-masingnya kepada saya.
# ./run > /dev/null
# ./run > /dev/null 1>&2
# ./run > /dev/null 2>&1
Jawaban yang Diterima:
# ./run > /dev/null
Ini mengalihkan stdout ke /dev/null
, tetapi tidak melakukan apa pun dengan stderr. Karena Anda meminta untuk mengalihkan dari stdout dan stderr, ini tidak melakukan apa yang Anda inginkan.
# ./run > /dev/null 1>&2
Ini mengalihkan stdout ke /dev/null
, dan kemudian mengalihkan stdout lagi (1>
) ke mana pun stderr menunjuk (&2
) yang mungkin merupakan terminal dan mungkin tempat yang ditunjuk stdout sebelum Anda mengarahkannya. Jadi efek bersihnya di sini adalah (mungkin) tidak ada pengalihan sama sekali untuk stdout, dan untuk stderr, Anda masih tidak melakukan apa pun dengannya. Jadi ini juga bukan yang Anda inginkan.
# ./run > /dev/null 2>&1
Ini mengalihkan stdout ke /dev/null
, dan kemudian mengalihkan stderr (2>
) ke mana pun stdout menunjuk, yaitu /dev/null
karena di situlah Anda baru saja mengarahkannya. Sepertinya ini yang Anda inginkan.
Saya tidak bisa membedakan perbedaan mereka.
Sebenarnya, Anda harus bisa membedakan perbedaan dengan cukup mudah. Katakanlah ./run
berisi ini:
#!/bin/sh
echo stdout
echo stderr >&2
Maka hasilnya harus sebagai berikut:
# ./run > /dev/null
stderr
# ./run > /dev/null 1>&2
stdout
stderr
# ./run > /dev/null 2>&1
Perbedaannya jelas!