Nos tutoriais e instruções, muitas vezes vejo comandos combinados. Por exemplo,
sudo apt-get update && sudo apt-get install pyrenamer
Parece haver quatro possíveis conectores: &
, &&
, ||
e ;
. Embora o &
conector seja claro para mim (ele envia um processo para o plano de fundo e deixa o terminal disponível), não está claro qual é a diferença entre &&
e ;
. E eu não sabia ||
até o comentário de Kaya.
As perguntas a seguir lidam com a diferença entre os dois conectores, mas principalmente nos comentários:
Então, aqui estão algumas perguntas relacionadas:
- Qual é a diferença entre
;
e&&
? - Quando você deve usá-los, respectivamente? Seria bom ver alguns casos de uso: se eu quiser executar um comando e depois desligar o computador, qual conector devo escolher?
- Quais são suas vantagens e perigos ? Robie Basak menciona em um comentário a esta resposta que um comando como
cd /somewhere_else; rm -Rf *
pode ter consequências destrutivas se o primeiro elemento da cadeia de comando falhar, por exemplo. - Se relevante, de onde eles vêm?
command-line
bash
don.joey
fonte
fonte
||
é o mesmo que&&
exceto que ele só executa o segundo comando se o primeiro sair com um status diferente de zero (sem êxito).set -e
interromperá o script com falha, como se todos os comandos estivessem conectados&&
.Respostas:
Folha de dicas:
fonte
A & B &
: Execute A em segundo plano, depois execute B em segundo plano (independentemente do sucesso) e retorne o controle ao shell. Isso geralmente funciona da mesma forma que executar os dois processos ao mesmo tempo.(A && B) &
.&&
somente executa o segundo comando se o primeiro saiu com o status 0 (foi bem-sucedido).;
executa os dois comandos, mesmo que o primeiro saia com um status diferente de zero.Seu exemplo com
&&
pode ser parafraseado equivalentemente comofonte
;
se o segundo comando não precisar do anterior para ter sucesso.O uso
;
executará os comandos independentemente de o primeiro comando ser bem-sucedido ou não.usando
&&
execute o segundo comando somente quando o primeiro comando for executado com sucesso (status 0).Ambos são usados em diferentes perspectivas. Como para um processo mais longo, digamos que para uma instalação você precise compilá-lo e instalá-lo. você deveria
make && make install
. Portanto, a instalação será executada apenas se formake
bem-sucedida.Portanto, para comandos dependentes, você deve usar
&&
Torcer bash ou comandos com comandos independentes usam
;
Portanto, se você deseja desligar o computador, até o primeiro trabalho falhou
;
, mas se desejar, no sucesso completo do primeiro trabalho, inicie o desligamento&&
fonte
a ; b
executará b, independentemente do status de saída de a.a && b
executará b apenas se a tiver êxito.Isso é necessário e suficiente para responder às três primeiras perguntas. Em particular, o 2 é muito amplo e não pode receber "uma" resposta definitiva - sua melhor aposta é decidir caso a caso.
Quanto à quarta pergunta: eles são sintaxe do Bash .
Também não há perigo intrínseco ao usar. Mais uma vez, a definição acima é suficiente. Isso implica que você escreverá
&&
quandob
tiver efeitos indesejados, sea
não for bem-sucedido. Não há necessidade de mais regras ou explicações, IMHO.fonte
Uma regra muito boa. Eu acrescentaria que, em alguns casos, usar esses comandos em um subshell faz sentido quando queremos considerá-los como uma única unidade ou não queremos combinar alguns resultados de operações com o shell atual.
Exemplos:
-concatenar a saída de dois comandos:
- entrando em um diretório e executando um comando a partir daí, sem alterar o diretório atual do shell:
fonte