2012-09-20 7 views
22

-e seçenek kümesi içeren bir bash komut dosyası var, bu da tüm komut dosyasını ilk hatada başarısız oluyor.-e seçeneği ayarlandığında bir bash komut dosyasının başarısız olmasından nasıl kaçınılır?

Komut dosyasında bir dizinde ls yapmayı deniyorum. Fakat bu yol mevcut olabilir veya olmayabilir. Yol mevcut değilse, -e bayrağı ayarlandığından ls komutu başarısız olur.

Komut dosyasının başarısız olmasını engelleyebileceğim bir yol var mı?

Bir yan not olarak, bu komuttan önce ve sonra bir set +e ve set -e yapmak için hile denedim ve çalışır. Ama daha iyi bir çözüm arıyorum.

cevap

30

yoksa

function myLs() { 
    LIST="" 
    folder=$1 
    [ "x$folder" = "x" ] && folder="." 
    [ -d $folder ] && LIST=`ls $folder` 
    echo $LIST 
} 

Bu şekilde bash başarısız olmayacak klasörün varlığını test edilecek ve bir komut garantili 0 durumu ile çıkmak için:

ls $PATH || echo "$PATH does not exist" 

bileşik komutu $PATH var olup olmadığını başarılı için, set -e tetiklenmez ve komut dosyanızdan çıkılmayacaktır.

Eğer true komutunu kullanabilirsiniz, sessizce hatayı bastırmak için: bileşiğin birini kullanabileceğiniz gibi, birden fazla komutu çalıştırabilmek için

ls $PATH || true 

komutları:

ls $PATH || { command1; command2; } 

veya

ls $PATH || (command1; command2) 

Yalnızca bileşik komutun içinde hiçbir şeyin başarısız olmadığından emin olun. İkinci örnek bir yararı geçerli kabuğunda durumunu etkilemeden alt kabuğa içindeki ani çıkış modunu kapatmak olmasıdır:

ls $PATH || (set +e; do-something-that-might-fail) 
+0

Yanıt için teşekkürler. Hala birkaç şüphem var. Eğer 'ls 'komutu başarısız olursa, hala bir mesaj basar, o kadar yol bulamazsa, bunu bastırmanın bir yolu var mı? Ayrıca, 'OR' bölümünde, 2 satırlık kod yürütmenin bir yolu var mı? – Bhushan

2

bir çözüm $folder Sen "yakalamak" hatası || kullanarak yapabilirsiniz

5

Diğer bir seçenek EXIT sinyali yakalamak için trap kullanmaktır:

trap 'echo "ls failed" ; some_rescue_action' EXIT 
ls /non_exist 
İlgili konular