Nasıl sadece stderr zsh boru olabilir?


18

Bash'da:

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

Zsh'deyken:

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

Standart çıkış yeniden yönlendirilirken yalnızca standart hata oluşturmanın bir yolu var mı?

Yanıtlar:


22

Zsh ile ve açık (varsayılan olarak açık) mult_iosseçeneği ile:

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

Bu 1> /dev/null | cat, echostdout'un çoklu yönlendirmesi olarak görülür .

Yani echo's stdout şimdi her ikisine /dev/nullve bir boruya cat(sanki kullanılıyor gibi tee) yönlendirilir.

Bu çoklu yönlendirmeyi iptal etmek için şunları yapabilirsiniz:

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

Yani, yeniden yönlendirmeden önce stdout'u kapatmak (boruları iptal etmek) /dev/null

Veya aşağıdaki gibi bir komut grubu veya alt kabuk kullanın:

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

Bu şekilde, echo'stdout yalnızca bir kez açıkça yönlendirilir (gruba / alt kabuğa boru yeniden yönlendirmesi uygulanır ve tarafından devralınır echo).

Veya multiostamamen devre dışı bırakabilirsiniz :

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

Alternatif olarak, bir boru yerine işlem ikamesi kullanabilirsiniz :

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

Ancak, iş kontrolü kapalıyken (komut dosyalarında olduğu gibi), catişlemin senkronize olmayan bir şekilde (başlangıçta olduğu gibi) çalışacağına dikkat edin &.


3
Teşekkürler! Etrafında dolaşmanın başka bir yolu (echo hi 2>&1 1>/dev/null) | cat.
Tavian Barnes

1
@TavianBarnes, iyi bir nokta, teşekkürler. Bütünlük için cevaba ekledim. Ayrıca bir komut grubu ( {echo...}|cat) ile çalışır
Stéphane Chazelas
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.