Em bash
, às vezes eu quero executar vários comandos em série e não quero esperar que eles terminem antes de digitar os novos. Então eu faço algo assim:
cmd1; cmd2; cmd3
Infelizmente, um dos comandos pode falhar. Nesse caso, eu gostaria de parar. Existe uma maneira fácil de fazer isso, mas faça com que eu continue executando os comandos apenas se o comando anterior tiver um código de saída 0?
command-line
bash
metáfora pitônica
fonte
fonte
Respostas:
Use
&&
operador,No shellscripting,
&&
e||
operadores são modelados após a implementação otimizada de operadores lógicos em C.&&
significa operador AND e||
meio OR. O Unix está intimamente relacionado a C e, em C, o segundo operando de operadores lógicos não é avaliado se o resultado já for conhecido no primeiro operando. Por exemplo,"false && x"
éfalse
para qualquer umx
, portanto não há necessidade de avaliarx
(especialmente sex
for uma chamada de função); Da mesma forma para"true || x"
. Isso também é chamado de semântica de curto-circuito .E no Unix, é tradicional interpretar os valores de retorno dos comandos como valores de verdade de "conclusão com êxito": código de saída 0 significa
true
(sucesso), diferente de zerofalse
(falha). Portanto, quando o primeiro comandocmd1 && cmd2
retornar"false"
(status de saída diferente de zero, o que indica falha), o status do comando composto é conhecido: falha. Portanto, a interpretação geral decmd1 && cmd2
pode ser: "executecmd1
E ENTÃO, se não falharcmd2
". Qual é o que você basicamente quer na sua pergunta.Da mesma forma com OR:
cmd1 || cmd2
pode ser interpretado como "executarcmd1
, OU SE falharcmd2
".Protip: para cadeias mais longas
&&
, considere colocarset -e
seu script. Basicamente, muda o ponto;
- e - vírgula para&&
, com alguns casos especiais.fonte
||
A || B
é exatamente o mesmo que o lógico A ou B [em curto-circuito] .A || B
é sucesso quandoA
foi sucesso , ou quandoA
foi fracasso, masB
foi sucesso ; eA || B
é falha quandoA
era falha eB
erafailure
. Da mesma forma&&
, segue AND lógico.;
(ou nova linha) faz por padrão.set -e
vai se transformar;
em&&
, grosso modo.set +e
[o padrão] se transformaA; B
no que você diz: corraA
, então não importa o que corraB
."Encadeando comandos e agrupando-os"
pings, apenas se não tiver êxito, executa o grupo de comandos encadeado entre colchetes.
Atenção:
A lista deve ser finalizada com um ";".
Deve haver espaços em branco entre colchetes e os comandos agrupados!
fonte
Simplesmente com o
&&
operador. Por exemplo:Se um dos comandos falhar (retorna um valor de saída diferente de 0), os outros comandos não serão executados.
fonte