Stderr ve stdout komutunu / dev / null komutuna / bin / sh komutuna yönlendirin


61

Her iki yönlendirmek için yollar her türlü denedim stdoutve stderrhiç /dev/nullolmadan herhangi bir başarı. Neredeyse tüm hayatım boyunca bu sorunla hiç karşılaşmadığım bash koşusu yaşadım, ancak bir keresinde BSD'de sıkışıp kaldım /bin/sh.

Ne denedim:

if ls ./python* 2> /dev/null; then
    echo found Python
fi

... hangi çalışır; Python yoksa, hata mesajlarını ls'den susturur. Ancak, varsa python.tgz, şöyle görünen bir çıktının alındığı satır:

# ./test.sh
./python-2.7.3p1.tgz

Denedim:

if ls ./python* &> /dev/null; then
    echo found Python
fi

ve

if ls ./python* 2>1 > /dev/null; then
    echo found Python
fi

ve

if ls ./python* > /dev/null; then
    echo found Python
fi

Hiçbir şey gerçekten işe yaramaz. Çıktılardan yalnızca birini yönlendirebilirim, ikisini aynı anda değil.

Yanıtlar:


102

Bu, Posix uyumlu herhangi bir kabukta çalışacaktır:

ls good bad >/dev/null 2>&1

Yapmalisin stdout'u yönlendirme ilk Stderr içine çoğaltarak önce ; ilk önce onu kopyalarsanız, stderr sadece stdout öğesinin asıl işaretini gösterecektir.

Bash , zsh ve diğer bazı kabukları da kısayol sağlar

ls good bad &>/dev/null

komut satırında kullanışlıdır ancak taşınabilir olması istenen betiklerde kaçınılmalıdır.


1
Aslında, bourn shell kılavuzunu okudum. Bu sonraki sürümlerinde belirtti /bin/shuygulayan &>/dev/nullsözdizimi, aparently o kadar veya i (i yeterli olmalıdır böylece tho OpenBSD'yi 5.3 çalıştıran, herhangi bir şekilde yankı olamaz) bir eski bir sürümünü
Torxed

8
@Torxed, OpenBSD en shpdksh dayanmaktadır. Bugünlerde daha fazla Bourne kabuğu yok. cshtanıtılan >&da mevcuttur zsh. POSIX uyumluluğunu açıkça ihlal etmesine rağmen (şimdi ve aynı zamanda bazı türevler tarafından da desteklendi) bashseçti , çünkü tamamen geçerli bir POSIX sözdizimi, tamamen farklı bir şey anlamına geliyor. &>zshpdkshfoo &> file
Stéphane Chazelas

3
@ StéphaneChazelas (...) Bu tamamen farklı bir şey anlamına geliyor. Beni bu durumda ne anlama geldiğini merak ettin ... :)
Piotr Dobrogost

4
@PiotrDobrogost, foo &> filebenzer foo & > fileya da foo & : > file(olası böyle kullanılmak üzere) tüm hiçbir komut için yazma arka plan ve açık dosyasında foo çalıştırılır.
Stéphane Chazelas

5
@PiotrDobrogost, >&ideal değildir ya da çelişen olarak >&2, >&-operatörler. zshCsh kullanıcıları için kolaylık sağlamak için ekledi (Csh sahip değil >&2). Onlar sadece sözdizimsel şeker, sadece > file 2>&1standart ve taşınabilir (Bourne benzeri kabukları için) kullanın.
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.