Pertimbangkan nama skrip berikut (agak konyol) 'test1.sh':
#/bin/bash
#
sleep 10 &
echo sleep pid = $!
pkill sleep
Ketika saya menjalankannya, saya tidak hanya mendapatkan output dari gema, tetapi laporan bash tentang kematian tidur di stderr:
$ ./test1.sh
sleep pid = 3551
./test1.sh: line 5: 3551 Terminated sleep 10
Dalam hal ini, saya ingin menekan hasil cetak ke stderr. Saya tahu saya bisa melakukannya di baris perintah, seperti pada:
$ ./test1.sh 2> /dev/null
... tetapi apakah ada cara untuk menekannya dari dalam skrip? (Saya tahu saya bisa membungkusnya dalam skrip kedua dan meminta pembungkusnya mengalihkannya, tetapi pasti ada sesuatu yang lebih mudah ...)
bash
shell-script
stderr
fearless_fool
sumber
sumber
Jawaban:
Kamu benar; pkill tidak menghasilkan pesan, tapi bash. Anda menyarankan itu
adalah solusi yang memungkinkan. Seperti yang ditunjukkan UVV, tindakan setara dari dalam skrip adalah
Ini mengarahkan ulang stderr untuk skrip
/dev/null
dari pernyataan ini hingga diubah kembali. Cara kikuk untuk mengubahnya kembali meliputiyang mengarahkan stderr ke terminal. Ini mungkin (tetapi tidak harus) di tempat asalnya.
Atau
yang menetapkan stderr sama dengan stdout, dan kemungkinan besar salah.
Cara yang lebih andal adalah
yang menyimpan stderr asli dalam file descriptor 3, dan kemudian mengembalikannya.
Cara lain untuk menekan hanya pengumuman proses kematian termasuk
dan
yang mengubah stderr hanya untuk perintah yang dikelompokkan.
sumber
stdin
danstderr
deskriptor file baru, mengirim deskriptor asli ke/dev/null
dan kemudian mengembalikannya?{ sleep 10 & pkill sleep;} 2> /dev/null
Menurut ini, Anda dapat melakukan sesuatu seperti berikut:
sumber