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


71

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

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?

Respostas:


88

O ;justo separa um comando do outro. A &&única diz que execute o seguinte comando, se o anterior foi bem sucedida

cd /home; ls -al

Isso ocorrerá cd /homee mesmo que o cdcomando falhe ( /homenão existe, você não tem permissão para percorrê-lo etc.), ele será executado ls -al.

cd /home && ls -al

Isso executará apenas ls -alse o cd /homefoi bem-sucedido.


2
usar of ; é realmente muito perigoso (pelo menos com o comando rm), por exemplo cd /some/dir; rm -fr ./*. Portanto, com essa operação destrutiva, você deve ter certeza de que está no lugar certo antes de executar o rm. O comando certo écd /some/dir && rm -fr ./*
ALex_hha 18/04/2016

70
a && b

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

a || b

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

a ; b

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


16
cd /fakedir; ls -al

É executado lsno diretório atual porque cd /fakedirfalhará e o shell ignorará o status de saída que não é zero.

cd /fakedir && ls -al

Como o &&operador continuará apenas se o comando anterior sair normalmente (status zero), nenhuma lsoperação será executada.

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


4

Você também pode juntá-los como uma if..then..elselógica de comando para encadeamento.

exemplo:

ls file.ext && echo "file exists" || echo "file does not exist"
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.