Ponto e vírgula ou duplo comercial para comandos de encadeamento? [duplicado]

0

Ao escrever um script bash, que é melhor para encadear comandos, um ponto-e-vírgula ; ou duplo e comercial && ?

    
por Micheal Saunders 20.04.2018 / 21:09

1 resposta

6

Como diz a steeldriver , nenhum deles é melhor que o de outros. Você os usa para diferentes propósitos.

Use ; se você quiser executar um comando e depois outro. O segundo comando será executado independentemente de o primeiro ter sido ou não bem-sucedido. A separação de comandos com um ; alcança o mesmo objetivo que executar um comando e depois executar o outro. Em um script, eles alcançam o mesmo objetivo:

first-command
second-command
first-command; second-command

Por outro lado, && verifica o status de saída do primeiro comando e só executa o segundo comando se o primeiro comando for bem-sucedido. No script de shell (e quando você está usando um shell de forma interativa também), um código de saída 0 é considerado "true" ou "success", enquanto qualquer outro código de saída é usado para significar "false" ou "failure". " (Dessa forma, os programas podem retornar códigos de erro diferentes para significar diferentes tipos de erros.)

Então, aqui, como antes, first-command é executado primeiro. Mas se não for bem sucedido, então second-command não será executado:

first-command && second-command

Isso é semelhante, mas não exatamente o mesmo, usando if :

if first-command; then
    second-command
fi

A maneira como eles são diferentes está no que acontece quando first-command falha. Com && , o status de saída do comando composto inteiro é qualquer código de saída com falha (ou seja, diferente de zero) first-command retornado. Em contraste, com if , o status de saída do comando composto inteiro é zero (isto é, sucesso) quando first-command falha.

Como exemplo de uma situação em que você pode razoavelmente considerar ; e && , suponha que você queira executar sudo apt update , que recupera informações atualizadas sobre quais pacotes estão disponíveis em cada um de seus fontes de software configuradas e em quais versões, seguidas por sudo apt upgrade , para atualizar seus pacotes instalados para suas versões mais recentes disponíveis. Isso é amplamente sugerido e é o que eu geralmente executo:

sudo apt update && sudo apt upgrade

Como ele usa && , ele executa sudo apt update , mas só executa sudo apt upgrade se sudo apt update informar que foi bem-sucedido. A razão pela qual você geralmente deseja isto, no caso desses comandos em particular , é que você normalmente desejaria inspecionar quaisquer erros que o primeiro comando produzisse para decidir como proceder.

Mas você pode esperar um problema, mas ainda quer atualizar os pacotes que você pode. Ou talvez você não espere um problema, mas apenas prefira prosseguir de qualquer maneira. Nessa situação, você poderia separá-los com ; (ou apenas colocá-los em linhas separadas, em um script):

sudo apt update; sudo apt upgrade

Isso executa sudo apt update e, em seguida, executa sudo apt upgrade , independentemente de ter relatado o sucesso ou não.

Isso funciona como um exemplo de uma situação em que você pode realmente escolher entre os dois, porque é um caso em que o primeiro comando é importante para o segundo, mas onde o segundo ainda pode ser útil mesmo se o primeiro um falhou. No entanto, em muitas situações em que você deseja executar um comando e depois outro, você tem:

  • Não há dependência do segundo comando no primeiro, em que se o primeiro falhar, você ainda deseja executar o segundo e sua capacidade de obter êxito não deve ser afetada. Então você normalmente usará ; ou os colocará em linhas separadas de um script.
  • Completa dependência do segundo comando no primeiro, de tal forma que não faria sentido - ou seria ativamente prejudicial - tentar o segundo comando se o primeiro tivesse falhado. Então você vai querer usar && para separá-los.

A propósito, há também um operador || . Isso executará o segundo comando apenas se o primeiro comando falhar em vez de apenas se tiver êxito (como em && ):

first-command || second-command

|| não deve ser confundido com | , que configura um canal entre os comandos.

    
por Eliah Kagan 20.04.2018 / 21:39