Como faço para encadear comandos no console?

23

Em bash , às vezes 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, gostaria de parar. Existe uma maneira fácil de fazer isso, mas fazer com que eu continue executando os comandos apenas se o comando anterior tivesse um código de saída 0?

    
por pythonic metaphor 20.01.2011 / 19:32

3 respostas

38

Use && operator,

cmd1 && cmd2 && cmd3

Em shellscripting, os operadores && e || são modelados após a implementação otimizada dos operadores lógicos em C. && significa operador AND e || significa OR. Unix está estreitamente relacionado a C, e em C, o segundo operando de operadores lógicos não é avaliado se o resultado já é conhecido do primeiro operando. Por exemplo. "false && x" é false para qualquer x , portanto, não há necessidade de avaliar x (especialmente se x for alguma expressão booleana complexa); similarmente 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 verdadeiros de "conclusão bem-sucedida": código de saída 0 significa true (sucesso), diferente de zero significa false (falha). Portanto, quando o primeiro comando em cmd1 && cmd2 retorna "false" (status de saída diferente de zero, que indica falha), o status do comando composto é conhecido: falha. Portanto, a interpretação geral de cmd1 && cmd2 pode ser: "execute cmd1 , E ENTÃO, se não falhar, cmd2 ". O que você basicamente quer em sua pergunta.

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

Protip: para cadeias mais longas de && , considere colocar set -e em seu script. Ele basicamente altera o ponto-e-vírgula ; para && , com alguns casos especiais.

    
por 20.01.2011 / 19:34
12

"Encadeamento comanda um agrupamento deles"

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

pings, somente se não for bem-sucedido, executa o grupo encadeado de comandos entre colchetes.

Atenção:

A lista tem que ser terminada com um ";".

Deve haver espaços em branco entre parênteses e os comandos agrupados!

    
por 04.03.2012 / 11:41
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.

    
por 20.01.2011 / 20:54