Yanıtlar:
Bir yaklaşım set -e
, betiğinizin başına eklemektir . Bu (dan help set
) anlamına gelir :
-e Exit immediately if a command exits with a non-zero status.
Bu nedenle, komutlarınızdan herhangi biri başarısız olursa, komut dosyası çıkacaktır.
Alternatif olarak, exit
olası hata noktalarına açık ifadeler ekleyebilirsiniz :
command || exit 1
set -e
bunu yapmanın tek yolu bu.
set -e
edilir sleep
( break
özel yerleşiğini olmanın, script en kabuklarda başarısızlık üzerine çıkmasına neden olur komutları if
veya solundaki &&
etkilenmez set -e
, n=...
eğer başarısız olabilir n
salt okunur ama daha sonra bu komut dosyasından da çıkmadan çıkacaktır set -e
), böylece yorumlama oldukça olası görünmemektedir. Sorunun kötü ifade edildiğine katılıyorum.
Anahtar kelimeyi kullanarak herhangi bir yerden bir komut dosyasından çıkabilirsiniz exit
. Ayrıca, betiğinizin, örneğin exit 1
veya exit 2
diğerlerinin nasıl başarısız olduğunu veya nasıl olduğunu diğer programlara belirtmek için bir çıkış kodu belirleyebilirsiniz . (Kurallara göre, çıkış kodu 0, başarı için ve 0'dan büyük herhangi bir şey başarısızlık anlamına gelir; 127 üzerindeki kodlar anormal sonlandırma için ayrılmıştır (örneğin, bir sinyal ile).
Başarısızlıktan çıkacak genel yapı şudur:
if [ failure condition ]; then
exit n
fi
uygun failure condition
ve n
. Ancak, belirli senaryolarda farklı şekilde ilerleyebilirsiniz. Şimdi, davanız için sorunuzu yorumluyorum, beş gksu
başarısızlıktan herhangi birinin başarısız olması durumunda, o zaman çıkmak istiyorsunuz. Bunun bir yolu, böyle bir işlevi kullanmaktır
function try_command {
for i in 1 2 3 4 5 ; do
if gksu command ; then
return 0
fi
fi
exit 1
}
ve sonra, döngü tarafından çağırılır try_command
.
Sorunuzu nasıl ele alacağınızla ilgili (daha fazla) gelişmiş veya karmaşık yollar vardır. Bununla birlikte, yukarıdaki çözüme yeni başlayanlar için Stephane'nin çözümünden daha erişilebilir.
attempt=0
until gksu command; do
attempt=$((attempt + 1))
if [ "$attempt" -gt 5 ]; then
exit 1
fi
done
exit
alt kabukta çağrılmadıkça komut dosyasından çıkar. Komut dosyasının bu bölümü bir alt kabuktaysa, örneğin bir boru hattının içinde (...)
ya $(...)
da içinde olduğundan , yalnızca o alt kabuktan çıkar .
Bu durumda, betiğin alt kabuğa ek olarak çıkmasını istiyorsanız, exit
o alt kabuğun çıkmasını çağırmanız gerekir .
Örneğin, burada 2 yuvalanmış alt kabuk seviyesi bulunur:
(
life=hard
output=$(
echo blah
[ "$life" = easy ] || exit 1 # exit subshell
echo blih not run
) || exit # if the subshell exits with a non-zero exit status,
# exit as well with the same exit status
echo not run either
) || exit # if the subshell exits with a non-zero exit status,
# exit as well with the same exit status
Alt kabuk bir boru hattının parçasıysa daha zor olabilir. bash
özel sahiptir $PIPESTATUS
benzer dizi zsh
s' $pipestatus
burada size yardımcı olabilir one:
{
echo foo
exit 1
echo bar
} | wc -c
subshell_ret=${PIPESTATUS[0]}
if [ "$subshell_ret" -ne 0 ]; then
exit "$subshell_ret"
fi
Tuzak bir sinyal aldıktan sonra bir eylem gerçekleştirir.
trap "echo EXIT; exit" 0
trap "echo HUP; exit" 1
trap "echo CTL-C; exit" 2
trap "echo QUIT; exit" 3
trap "echo ERR; exit" ERR
n=0
until [ $n -ge 5 ]
do
n=$[$n+1]
echo $n
sleep 3
done
Bunu çalıştırın ve normal şekilde çıkmasına izin verin. 0 sinyalinde tutulur.
EXIT
Tekrar çalıştır ve ^ C ile kes. Hem sinyal 2 hem de sinyal 0'da tuzak kurar.
CTL-C
EXIT
Sıfır olmayan bir çıkış durumu ERR'ye kapanacak
ERR
EXIT
set -e
özelliğini kullanmak yerine, yanlış düşünmeye bazı düşünceler koyarlar . Burada gerçekten geçerli değil. OP, komutu çalıştırmak için 5 başarısız denemeden sonra komut dosyasından çıkmak istiyor.