Kelimenizi " her komut önceki her komut bağlıdır. Herhangi bir komut başarısız olursa tüm komut dosyası başarısız olmalıdır " kelimenin tam anlamıyla, hataları tedavi etmek için herhangi bir özel işlev gerekmez düşünüyorum.
Tek ihtiyacınız olan komutlarınızı tam olarak yazdıklarınızı yapan &&
operatör ve ||
operatör ile zincirlemek .
Örneğin bu zincir kırdı ve eğer "bir şeyler ters gitti" yazdırır olacak herhangi bir önceki komutları (soldan sağa bash okur) kırdı
cd foo && rm a && cd bar && rm b || echo "something went wrong"
Gerçek örnek (sadece gerçek bir demo için dir foo, dosya a, dir bar ve dosya b oluşturdum):
gv@debian:/home/gv/Desktop/PythonTests$ cd foo && rm a && cd bar && rm bb || echo "something is wrong"
rm: cannot remove 'bb': No such file or directory
something is wrong #mind the error in the last command
gv@debian:/home/gv/Desktop/PythonTests$ cd foo && rm aa && cd bar && rm b || echo "something is wrong"
rm: cannot remove 'aa': No such file or directory
something is wrong #mind the error in second command in the row
Son olarak, tüm komutlar başarıyla yürütüldüyse (çıkış kodu 0), komut dosyası devam eder:
gv@debian:/home/gv/Desktop/PythonTests$ cd foo && rm a && cd bar && rm b || echo "something is wrong"
gv@debian:/home/gv/Desktop/PythonTests/foo/bar$
# mind that the error message is not printed since all commands were successful.
Hatırlanması gereken önemli olan, && next komutunun kullanılmasıyla, bash için başarı anlamına gelen 0 kodundan önceki komuttan çıkıldığında yürütülür.
Zincirde herhangi bir komut yanlış giderse, komut / komut dosyası / ne olursa olsun || infaz edilecek.
Ve sadece kayıt için, Kırılan komuta bağlı olarak farklı eylemler gerçekleştirmeniz gerekiyorsa $?
, tam olarak önceki komutun çıkış kodunu raporlayan değeri izleyerek klasik komut dosyası ile de yapabilirsiniz (komut başarıyla çalıştırılırsa sıfır döndürür) veya komut başarısız olursa başka bir pozitif sayı)
Misal:
for comm in {"cd foo","rm a","cd bbar","rm b"};do #mind the error in third command
eval $comm
if [[ $? -ne 0 ]];then
echo "something is wrong in command $comm"
break
else
echo "command $comm executed succesful"
fi
done
Çıktı:
command cd foo executed succesfull
command rm a executed succesfull
bash: cd: bbar: No such file or directory
something is wrong in command cd bbar
İpucu: "bash: cd: bbar: Böyle bir dosya yok ..." iletisini uygulayarak gizleyebilirsiniz. eval $comm 2>/dev/null