Como faço para encadear comandos no console?

23

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?

metáfora pitônica
fonte
Aqui está uma ótima resposta do Unix SE.
NonlinearFruit

Respostas:

39

Use &&operador,

cmd1 && cmd2 && cmd3

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"é falsepara qualquer um x, portanto não há necessidade de avaliar x(especialmente se xfor 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 zero false(falha). Portanto, quando o primeiro comando cmd1 && cmd2retornar "false"(status de saída diferente de zero, o que indica falha), o status do comando composto é conhecido: falha. Portanto, a interpretação geral de cmd1 && cmd2 pode ser: "execute cmd1E ENTÃO, se não falhar cmd2". Qual é o que você basicamente quer na sua pergunta.

Da mesma forma com OR: cmd1 || cmd2pode ser interpretado como "executar cmd1, OU SE falhar cmd2".


Protip: para cadeias mais longas &&, considere colocar set -eseu script. Basicamente, muda o ponto ;- e - vírgula para &&, com alguns casos especiais.

ulidtko
fonte
1
+1 para explicar # ||
31
você pode encadear qualquer que seja o status do primeiro comando? (sucesso ou fracasso)
Hugo Trentesaux
@HugoTrentesaux, o que você quer dizer? .. O sucesso / falha resulta ou A || Bé exatamente o mesmo que o lógico A ou B [em curto-circuito] . A || Bé sucesso quando Afoi sucesso , ou quando Afoi fracasso, mas Bfoi sucesso ; e A || Bé falha quando Aera falha e Bera failure. Da mesma forma &&, segue AND lógico.
ulidtko
No contexto do shell, como posso executar A e B, independentemente de A falhar ou ter êxito?
Hugo Trentesaux
1
@HugoTrentesaux é o que a planície comum ;(ou nova linha) faz por padrão. set -evai se transformar ;em &&, grosso modo. set +e[o padrão] se transforma A; Bno que você diz: corra A, então não importa o que corra B.
ulidtko
13

"Encadeando comandos e agrupando-os"

ping 192.168.0.1 || { echo "ping not successful"; exit 1; }

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!

e eu
fonte
6

Simplesmente com o &&operador. Por exemplo:

cmd1 && cmd2 && cmd3

Se um dos comandos falhar (retorna um valor de saída diferente de 0), os outros comandos não serão executados.

Wuffers
fonte