Eles parecem sinalizar para o BASH começar com outro comando após os símbolos, mas há uma diferença distinta?
command-line
bash
Michael Terry
fonte
fonte
Você pode tentar a diferença por si mesmo:
ls /invalid/path && echo "hello!"
como / invalid / path não existe, não é possível mostrar a listagem do diretório. Ele falhará com uma mensagem de erro: "ls: / invalid / path: Esse arquivo ou diretório não existe".
A segunda metade do comando (eco "olá!") Nunca é executada porque a primeira metade falhou.
ls /invalid/path ; echo "hello!"
A mesma mensagem de erro aparece como antes, mas desta vez, a segunda parte é executada !
ls: / invalid / path: Não existe esse arquivo ou diretório
Olá!
Por que isso é útil?
Suponha que você deseja extrair um arquivo chamado archive.tar.gz
Você pode usar o comando
tar zxvf archive.tar.gz && rm archive.tar.gz
.Se, por algum motivo, a extração do arquivo falhar, a segunda parte não será executada! Você pode tentar novamente.
Se você usar ; na mesma situação, o arquivo é excluído e você não pode tentar novamente.
fonte
&&
éAND
, o que significa que o segundo comando será executado apenas se o primeiro retornar verdadeiro (sem erros).fonte
AND
execução, o segundo parâmetro se torne irrelevante se o primeiro for igualfalse
e, portanto, o código subjacente seja otimizado para adiar a avaliação do segundo parâmetro até que ele saiba qual é o primeiro.&&
é apenas um operador binário, uma função. A única coisa "especial" é que é a notação de infixo (que é padrão para a maioria desses tipos de operadores) e a execução atrasada do segundo operando. Essa execução atrasada realmente oferece a capacidade de ser usada como algo que pode ser conceitualmente visto como umaif
declaração nesse contexto , mas isso não tira o fato de que o uso originalmente pretendido está dentro do condicional de umaif
declaração real . O uso aqui realmente é mais um "hack".a && b || c = (a && b) || c
. Ordem simples de avaliação. Não há realmente nenhum mistério lá. Se você os escrever como suas funções típicas, seria simplesmente parecidoor(and(a, b), c)
. Essa lógica é a mesma tanto dentro de umaif
condicional quanto na entrada direta na linha de comando, porque&&
e||
como operadores , eles pegam dois operandos e retornam outro.Atualização : eu adicionei como script para destacar algumas das possíveis armadilhas:
Como ninguém mais mencionou "||", eu irei
Atualização2 : algumas reformulações importantes aqui
&& são como um "então" de uma declaração "se" que responde a "verdadeiro"
|| NÃO é como o "else" de uma declaração "if" ..
|| é como um "então" de uma declaração "se" que responde a "falso"
Mais especificamente, && testa o $? retorna o valor da instrução executada mais recentemente
anteriore passa o controle para a instrução ou sub-shell imediatamente após o && ... ele somente passa o controle se $? é verdade.|| é semelhante e geralmente é visto após uma instrução &&, mas testa um valor de retorno falso ($?) da instrução executada mais recentemente
anterior... NB! Nota Bene! Observe bem! .... se a instrução precedente for uma instrução && que retrocede falso quando você espera que seja verdadeira, então || responderá ao falso, portanto, misturar os dois na mesma linha pode ser arriscadoO ponto principal que estou tentando cometer é em relação a um erro que cometi. ou seja:
## [[condição]] && A || B
is not não se comporta como um ternário de estilo C / C ++. ou seja:
// (condição)? A: B
Veja o script abaixo para exemplos de resultados "inesperados" de "A"
O teste básico e os && e os || A instrução deve estar na mesma linha ...
Execute este script para ver onde as coisas podem dar errado ao usar && e ||
A instrução executada mais recentemente pode não ser a que você espera.
[[condição]] && eco Olá || eco Adeus .... normalmente é seguro,
pois um eco bem formado retornará verdadeiro.
mas e quanto a acessar um arquivo que não sai?
fonte
experimentar
e
Veja a diferença
fonte
O comando (função, no caso de um script) depois
&&
é executado, dependendo do RETVAL do primeiro comando (função, no caso de um script). Força o primeiro comando a retornar um valor 0, se for bem-sucedido. Podemos verificar o valor de retorno para executar mais comandos.fonte