Bash Shebang para manequins?

36

Eu tenho alguns scripts bash que eu configurei 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 outros shebangs?

coneybeare
fonte
Essas opções são específicas para o Bash (ou outro intérprete). Eles podem ser os mesmos para outros shells (dash e ksh, por exemplo), mas seriam diferentes para outros intérpretes, como AWK e Python. Você pode usar muitas das opções que o intérprete aceita. As opções são específicas para o interpretador, enquanto o shebang é um recurso do kernel.
Pausado até novo aviso.

Respostas:

41

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

Observe que você pode portabilidade ter apenas um argumento na linha shebang: alguns departamentos (como o 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:

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

Outros programas podem entender essas opções, mas com significados diferentes.

Gilles 'SO- parar de ser mau'
fonte
24

São opções passadas para bashver help setmais 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.
cYrus
fonte
3
1 E -exfaz as duas coisas
Nifle
É confuso porque parecem opções de linha de comando passadas para o Bash.
Caoilte 19/09/12
2
@Caoilte: E na verdade eles são (de man bash): In addition to the single-character shell options documented in the description of the set builtin command, bash interprets the following options when it is invoked: [...].
Cyrus
1
arrgh! piscar e você sente falta! :).
Caoilte 19/09/12
0

Gostaria apenas de mencionar uma alternativa ainda melhor - como em mais portátil -:

#!/usr/bin/env bash

O exemplo acima usa envpara encontrar o bashexecutável, que nem sempre é /bin/bash. Os #!/bin/bashscripts antigos não funcionam no NixOS , por exemplo.

Se você usar envcomo demonstrado acima, você não pode fornecer um argumento, como -epara bash(tanto quanto eu sei). Mas você pode fazer isso:

#!/usr/bin/env bash
set -e
Simon Alling
fonte
2
Faço isso o tempo todo, mas não diria que é "mais portátil" - na verdade, o risco de o usuário executar algo completamente diferente (do que você pode assumir que um sistema seja fornecido) é muito maior. Por exemplo, o Ubuntu ainda envia o Bash 4, enquanto um usuário pode optar por executar o Bash 5.
slhck
Sim, o envuso não é bom, especialmente para scripts que executam python, porque você simplesmente não sabe se o padrão pythoné a versão 2 ou 3 e isso faz muita diferença para scripts que precisam de uma versão específica. Melhor ser explícito que crafty
smac89 14/07