2012-09-11 24 views
17

Başımı bunun etrafına saramam. /dev/null neden bir if bildirimine girdi olarak kullanılsın? < /dev/null'un kullanımı nedir?if()</ dev/null

if ($PROG --version) </dev/null> /dev/null 2>&1; then 
     $PROG 
else 
     echo "failed" 
     exit 1 
fi 

I (düşünmek) Ben > /dev/null 2>&1 sadece stdout ve stderr hem herhangi bir çıktı bastırmak için kullandığını anlıyoruz. $PROG Eğer

cevap

15

Eğer bir şeyler yazmanızı bekler, senaryonuz sonsuza durabilir stdin girdi bekleyen bir programdır. < /dev/null kullanımı böyle bir programa boş girdi sağlamaktır. > ve 2>&1 hakkında haklısınız.

Bu kod parçacığı, $PROG --version'un 0 durum (başarı) ile çıkıp çıkmadığını denetler ve daha sonra bu programı herhangi bir bayrak olmadan çalıştırır. $PROG --version başarısız olursa, komut "başarısız" yankılanır ve çıkar.

+0

Teşekkürler. Hala ne kadar yararlı olduğunu bilmiyorum, ne $ PROG olduğunu biliyorum ve 'PROG --version'un girdi beklemediğini biliyorum. Örneğin, 'PROG = autoconf', bunu gördüğüm yerlerden biridir.Ve biliyorum ki 'autoconf --version' girişi beklemiyor. Bu durumda hala yararlı mı? –

+0

@Carl Norum, '(' $ PROG --version ') '(açılı ayraçlı) komutunu çalıştırmak için burada kullanılabilir ve böylece' '/ dev/null'' 'a ihtiyaç duymaz mı? – fduff

+0

Açı braketleri? –

13

Yeniden yönlendirmenin parantezin dışında neden olduğunu merak ettiğinizi düşünüyorum. Bu satırda

:

if ($PROG --version) </dev/null> /dev/null 2>&1; then 

parantez if ifadesinin sözdizimi parçası değildir; sadece komut gruplamasını belirtirler. (O kendim hatırlamak Bana bir dakika sürdü; csh/tcsh içinde, bir if ifadesinin sözdizimi parçasıdır parantez.) Örneğin

bu:

(echo one ; echo two) | tr a-z A-Z 

bu çıktıyı üretecek : $PROG --version beri Bu durumda

ONE 
TWO 

, tek komut, ( $PROG birden fazla komuta genişler sürece, ama bu düşüktür) parantezler gereksizdir.

Yeniden yönlendirme, if bildirimi için geçerli değildir; $PROG --version için geçerlidir. Amaç, (boş bir dosyadan okuma yapıyormuş gibi) $PROG no'lu girdi sağlamak ve stdout veya stderr'e yazdığı her şeyi atmaktır. $PROG, --version ile çağrıldığında bile, stdin'den okuyan bir komutsa, giriş yönlendirmesi olmadan klavye girişini beklemeye alabilir.

komut bir hata üretmez sadece $PROG --version if (her ne olabilirse) $PROG çağırmak için güvenli olduğunu varsayar. Eğer bir if ifadesine yönlendirmeyi uygulayabilir

Not:

if test_command ; then 
    something 
else 
    something_else 
fi </dev/null> /dev/null 2>&1 

Bu test_command, something, vesomething_else için giriş ve çıkış yönlendirir.

+0

Harika bir cevap için teşekkür ederim! Parantez konusunda gerçekten kafam karışmıştı. Benim için bozduğun ve örnekler verdiğin için teşekkürler. Harika bir açıklama. –