Bash Shebang para manequins?

Bash Shebang para manequins?

Eu tenho alguns scripts bash que configurei e que usam principalmente

#!/bin/bash

mas regularmente encontro alguns que se parecem

#!/bin/bash -e
#!/bin/bash -x
#!/bin/bash -ex

e assim por diante.

Alguém pode explicar o significado e os benefícios dessas opções de shebang e se elas se aplicam a outras shebangs?

Responder1

Se um script /path/to/foocomeçar com #!/bin/bash, então executar /path/to/foo arg1 arg2será equivalente a executar /bin/bash /path/too/foo arg1 arg2. Se a linha shebang for #!/bin/bash -ex, é equivalente a executar /bin/bash -ex /path/too/foo arg1 arg2. Este recurso é gerenciado pelo kernel.

Observe que você pode ter apenas um argumento na linha shebang: alguns unices (como Linux) aceitam apenas um argumento, o que #!/bin/bash -e -xlevaria o bash a receber o único argumento de cinco caracteres -e -x(um erro de sintaxe) em vez de dois argumentos -ee -x.

Para o shell Bourne she shells derivados, como POSIX sh, bash, ksh e zsh:

  • -esignifica que se algum comando falhar (o que indica retornando um status diferente de zero), o script será encerrado imediatamente.
  • -xfaz com que o shell imprima um rastreamento de execução.

Outros programas podem compreender estas opções, mas com significados diferentes.

Responder2

São opções passadas para bashver help setpara mais informações, neste caso:

-x  Print commands and their arguments as they are executed.
-e  Exit immediately if a command exits with a non-zero status.

Responder3

Gostaria apenas de mencionar uma alternativa ainda melhor – mais portátil:

#!/usr/bin/env bash

O exemplo acima usa envpara encontrar o bashexecutável, que nem sempre está em /bin/bash. Seus scripts antigos #!/bin/bashnão funcionamNixOS, por exemplo.

Se você usar envcomo demonstrado acima, não poderá fornecer um argumento como -e( bashaté onde eu sei). Mas você pode fazer isso:

#!/usr/bin/env bash
set -e

Responder4

Iniciar um script com , ou equivalentemente executar , tem o mesmo efeito que inserir dentro do script logo após sua linha.#! /path/to/bash -optionbash -option /path/to/scriptset -option#!

set -xé essencialmente apenas para depuração; você não gostaria que fosse deixado normalmente.

O efeito set -eé muito mais complicado do que o manual sugere. A descrição mais precisa é aproximadamente:

Depois de invocar set -e, se umnão testadocomando sai com um status diferente de zero, fará com que o shell saia com esse status de saída.

eu digomais precisoporque ainda é bastante vago: a lista de situações em que o comando é consideradotestadoé misterioso e difícil de prever. As regras exatas diferem entre shells e até mudam entre versões do mesmo shell.

set -efaznãofaz com que o Bash saia em resposta ao status de saída diferente de zero de qualquer comando:

  • entre ife ;elifthenou
  • entre whilee ;untildoou
  • seguindo !; ou
  • seguido por ||ou &&ou &(embora para &o correspondente waitou fgpossa falhar); ou
  • seguido por |, a menos que set -o pipefailesteja em vigor; ou
  • dentro $( ... )quando usado como parte de um comando (não atribuições e/ou redirecionamentos simples, o que significa que foo=$( bar )falhará se barfalhar, mas local foo=$( bar )não falhará); ou
  • dentro de um comando composto onde o acima se aplica; ou
  • dentro de uma função shell invocada de qualquer lugar que se aplique acima.

Os efeitos em comandos compostos e funções shell são recursivos.

Como o próprio shell sai com um status diferente de zero, o efeito pode se propagar para fora de um subshell.

A !isenção aplica-se mesmo que o estado de saída invertido seja ignorado.

Por outro lado, set -eos gatilhos emtodos os outrosstatus diferente de zero, independentemente de significar "falha" ou simplesmente "falso". Por exemplo, ((x++))terá um status de saída de "falha" diferente de zero quando xfor inicialmente 0.

Por ser uma bagunça, existe uma escola de pensamento que diz que set -edeve ser evitado em favor da verificação explícita de todos os comandos.

Ou se você ainda quiser usar set -e, lembre-se de escrever !na frente de qualquer ((arithmetic))grupo.

informação relacionada