Existe uma diferença entre como dois e comercial e um ponto e vírgula operam em bash?

66

Se eu quisesse executar dois comandos separados em uma linha, poderia fazer isso:

cd /home; ls -al

ou isto:

cd /home && ls -al

E eu recebo os mesmos resultados. No entanto, o que está acontecendo em segundo plano com esses dois métodos? Qual é a diferença funcional entre eles?

    
por Sean P 24.03.2012 / 20:51

4 respostas

84

O ; apenas separa um comando do outro. O && diz apenas executar o seguinte comando se o anterior foi bem sucedido

cd /home; ls -al

Isso irá cd /home e mesmo se o comando cd falhar ( /home não existe, você não tem permissão para percorrê-lo, etc.), ele será executado ls -al .

cd /home && ls -al

Isso só executará o ls -al se o cd /home for bem-sucedido.

    
por 24.03.2012 / 20:58
68
a && b

se a retornar código de saída zero, então b será executado.

a || b

se a retorna código de saída diferente de zero, então b é executado.

a ; b

a é executado e, em seguida, b é executado.

    
por 26.03.2012 / 01:50
15
cd /fakedir; ls -al

Executa ls no diretório atual porque cd /fakedir falhará e o shell ignorará o status de saída que não é zero.

cd /fakedir && ls -al

Como o operador && só continuará se o comando anterior tiver saído normalmente (status zero), nenhuma operação ls será executada.

Existem outros operadores, como & , que será o segundo plano de um processo. Embora muitas vezes colocado no final de um comando, ele pode ser colocado no meio de uma cadeia.

    
por 24.03.2012 / 21:00
3

Você também pode uni-los como um if..then..else para a lógica de comando de encadeamento.

exemplo:

ls file.ext && echo "file exists" || echo "file does not exist"
    
por 08.03.2016 / 08:32