Bagaimana saya bisa pipa hanya stderr di zsh?

18

Dalam bash:

$ echo hi 2>&1 1>/dev/null | cat
$

Sementara di zsh:

$ echo hi 2>&1 1>/dev/null | cat
hi
$

Apakah ada cara untuk mem-pipe standard error saja sambil mengarahkan keluar standar?

Barnes Tavian
sumber

Jawaban:

22

Dengan zsh dan dengan mult_iosopsi aktif (diaktifkan secara default), di:

echo hi 2>&1 1>/dev/null | cat

Ini 1> /dev/null | catdilihat sebagai pengalihan ganda dari echostdout.

Jadi echostdout sekarang diarahkan ke keduanya /dev/nulldan pipa ke cat(seolah-olah menggunakan tee).

Untuk membatalkan beberapa pengalihan, Anda dapat melakukan:

echo hi 2>&1 >&- > /dev/null | cat

Artinya, menutup stdout (membatalkan perpipaan) sebelum dialihkan ke /dev/null

Atau gunakan grup perintah atau subkulit seperti:

{echo hi 2>&1 1>/dev/null} | cat 
(echo hi 2>&1 1>/dev/null) | cat

Dengan begitu, echostdout hanya dialihkan secara eksplisit sekali (pengalihan pipa diterapkan ke grup / subkulit dan diwarisi oleh echo).

Atau Anda dapat menonaktifkan multiossemuanya:

(setopt nomultios; echo hi 2>&1 > /dev/null | cat)

Atau, Anda bisa menggunakan proses substitusi alih-alih pipa:

echo hi 2> >(cat) > /dev/null

Namun catberhati- hatilah ketika kontrol pekerjaan dimatikan (seperti dalam skrip), proses akan berjalan secara tidak sinkron (seolah-olah dimulai dengan &).

Stéphane Chazelas
sumber
3
Terima kasih! Cara lain untuk menyiasatinya adalah (echo hi 2>&1 1>/dev/null) | cat.
Tavian Barnes
1
@TavianBarnes, poin bagus, terima kasih. Saya telah menambahkannya ke jawaban untuk kelengkapan. Ini juga bekerja dengan grup perintah ( {echo...}|cat)
Stéphane Chazelas