Itulah efek MULTIOS .
echo foo >&2 | grep foo
akan menulis foo
ke stderr dan juga pipa foo
ke grep
. Karena stderr default ke terminal, Anda akan melihat dua foo
baris, satu dari echo
, satu dari grep
hasilnya.
{ echo foo >&2 | grep foo } >/dev/null
Di sini, Anda melihat satu baris karena stdout dialihkan ke /dev/null
, Anda hanya melihat foo
garis dari echo
.
{ echo foo >&2 | grep foo } 2>/dev/null
Di sini, Anda melihat satu baris karena stderr dialihkan ke /dev/null
, Anda hanya melihat foo
garis dari grep
.
Anda dapat dengan mudah melihat perbedaan di terminal dengan warna garis keluaran. grep
akan menyorot pola yang cocok (atau Anda bisa memaksanya dengan menggunakan --color=always
).
MULTIOS
diaktifkan secara default dengan nomultios
opsi tidak disetel:
$ unsetopt | grep nomultios
nomultios
Untuk menonaktifkannya, cukup atur nomultios
opsi:
$ setopt nomultios
{echo foo >&2} | grep foo
, jika Anda melihat apa yang saya coba katakan. Saya pikir perintah yang saya tanyakan di atas akan mengarahkan stdout ke stderr dan kemudian mengirim stdout kosong ke grep.{echo foo >&2} | grep foo
,{echo foo >&2}
dianggap sebagai perintah, dan itu berjalan dalam subkulit. Anda dapat berpikir sepertiA | grep foo
manaA
adalah{echo foo >&2}
. Dalam hal ini,>&2
dan|
dipisahkan,MULTIOS
tidak berpengaruh di sini.