Como posso escrever um script de shell que saia, se uma parte falhar? Por exemplo, se o seguinte trecho de código falhar, o script deverá sair.
n=0
until [ $n -ge 5 ]
do
gksu *command* && break
n=$[$n+1]
sleep 3
bash
scripting
error-handling
Weylyn
fonte
fonte
set -e
. Realmente não se aplica aqui. O OP deseja sair do script após 5 tentativas fracassadas de executar o comando.set -e
é a única maneira que sei fazer isso.set -e
sãosleep
(break
sendo um built-in especial, o script pode sair com falha na maioria dos shells, os comandos naif
esquerda ou à esquerda de&&
não são afetadosset -e
,n=...
pode falhar sen
for somente leitura, mas depois que sairia do scriptset -e
também), de modo que a interpretação parece bastante improvável. Concordo que a pergunta está mal formulada.Você pode sair de um script em qualquer lugar usando a palavra-chave
exit
. Você também pode especificar um código de saída para indicar a outros programas que ou como o seu script falhou, por exemplo,exit 1
ouexit 2
etc. (por convenção, o código de saída 0 é bem-sucedido e qualquer coisa maior que 0 significa falha; no entanto, também por convenção, exit códigos acima de 127 são reservados para terminação anormal (por exemplo, por um sinal)).A construção genérica para sair em caso de falha é
com adequado
failure condition
en
. Mas em cenários específicos, você pode proceder de maneira diferente. Agora, no seu caso, interpreto sua pergunta de que, se alguma das cinco invocaçõesgksu
falhar, você pretende sair. Uma maneira é usar uma função como estae, em seguida, chame o loop por
try_command
.Existem (mais) maneiras avançadas ou sofisticadas de como resolver sua pergunta. No entanto, a solução acima é mais acessível para iniciantes do que, digamos, a solução da Stephane.
fonte
exit
sai do script, a menos que seja chamado em um subshell. Se essa parte do script está em uma subshell, por exemplo, porque é dentro(...)
ou$(...)
ou parte de uma linha de tubo, então ele só vai sair que subshell .Nesse caso, se você deseja que o script saia além do subshell, precisará chamar
exit
esse subshell.Por exemplo, aqui com 2 níveis aninhados de subshells:
Pode se tornar mais complicado se o subshell fizer parte de um pipeline.
bash
tem um especial$PIPESTATUS
array, semelhante aozsh
de$pipestatus
um que pode ajudá-lo aqui:fonte
A armadilha executará uma ação ao receber um sinal.
Execute isso e deixe sair normalmente. Prende no sinal 0.
Execute-o novamente e interrompa com ^ C. Ele intercepta o sinal 2 e o sinal 0.
Um status de saída diferente de zero será interceptado no ERR
fonte