Ternyata saya tidak tahu semua tujuan keluaran yang tersedia untuk digunakan. Saya tahu tentang stdout
( &1
) dan stderr
( &2
). Namun, setelah mengarahkan kedua deskriptor, saya terkadang masih mendapatkan beberapa output di konsol saya!
Contoh termudah yang bisa saya pikirkan adalah GNU Parallel; Setiap kali saya menggunakannya, saya melihat pemberitahuan kutipan. Bahkan ketika saya melakukannya &2>1 > file
, saya masih melihat pemberitahuan itu.
Dan hal yang sama berlaku untuk emerge
: Ketika saya menjalankan emerge dan ada beberapa masalah, beberapa informasi tidak dicetak stdout
juga stdin
, karena saya mengarahkan mereka dan mereka masih bisa melaluinya.
Saya kebanyakan memecahkan masalah ini dengan menggunakan script
, tetapi saya masih bertanya-tanya apa yang menyebabkan masalah ini.
sumber
/dev/tty
.parallel
:mkdir ~/.parallel; touch ~/.parallel/will-cite
akan menonaktifkan pesan yang mengganggu. Atau, lihat-lihat untuk implementasi lainnyaparallel
.parallel
sebagai contoh.Jawaban:
Sintaks yang Anda gunakan salah.
akan dibagi menjadi
Ini akan:
cmd
sebagai pekerjaan latar belakang tanpa pengalihanstderr
ke file yang secara harfiah dipanggil1
dan dialihkanstdout
kefile
Sintaks yang Anda inginkan adalah:
Urutan operasi itu penting. Ini akan:
stdout
kefile
stderr
ke&1
- yaitu filehandle yang sama denganstdout
Hasilnya adalah keduanya
stderr
danstdout
akan dialihkan kefile
.Dalam
bash
, sintaks non-standar yang lebih sederhana (dan jadi saya tidak merekomendasikannya, berdasarkan portabilitas)cmd &> file
melakukan hal yang sama.sumber
/dev/tty
, tetapi mudah-mudahan ini tidak terjadi terlalu sering (jika sama sekali).at
perintah di mesin Anda dan memiliki hak untuk menggunakannya, maka Anda dapat menjalankan perintah melaluiat now
. Lihat halaman manual untuk detailnya. Ini akan menjalankan perintah melalui mekanisme proses batch dan proses tidak akan pernah memiliki tty untuk menulis. Tapi, secara umum, saya tidak akan khawatir tentang kasus tepi ini. Biasanya hanya proses yang membutuhkan interaksi dan sengaja perlu menampilkan sesuatu kepada pengguna meskipun pengalihan akan digunakan/dev/tty
.Ada dua masalah.
Yang pertama adalah bahwa urutan itu penting, yang kedua adalah
/dev/tty
.Mari kita gunakan skrip ini sebagai contoh skrip yang ingin kami ambil keluarannya:
test.sh
:Sekarang mari kita lihat output dari perintah:
./testmyscript.sh 2>&1 >/dev/null
:Karena urutan evaluasi dari kiri ke kanan, pertama-tama kita mendapatkan "redirect
stderr
ke mana punstdout
keluaran (jadi, keluaran konsol)". Kemudian kita "dialihkanstdout
ke/dev/null
. Kita berakhir dengan situasi seperti ini:stdout
->/dev/null
stderr
-> konsolJadi kami melakukannya dengan benar:
./testmyscript.sh >/dev/null 2>&1
Dan kita mendapatkan:
ttdada
.Sekarang kita melakukan "Redirect
stdout
to/dev/null
", dan kemudian "Redirect stderr ke tempat stdout menunjuk" (jadi,/dev/null
). Hore!Namun, kami masih memiliki masalah; program dicetak ke
/dev/tty
. Sekarang saya tidak tahu bagaimana cara memperbaiki perilaku semacam ini, jadi Anda kemungkinan besar akan membutuhkannyascript
, tetapi semoga perilaku ini tidak terlalu sering terjadi.sumber