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?
Respostas:
Se um script
/path/to/foo
começar#!/bin/bash
, a execução/path/to/foo arg1 arg2
será 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 -x
levaria o bash a receber o único argumento de cinco caracteres-e -x
(um erro de sintaxe) em vez de dois argumentos-e
e-x
.Para o shell Bourne
sh
e 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.
fonte
São opções passadas para
bash
verhelp set
mais informações, neste caso:fonte
-ex
faz as duas coisasman 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: [...]
.Gostaria apenas de mencionar uma alternativa ainda melhor - como em mais portátil -:
O exemplo acima usa
env
para encontrar obash
executável, que nem sempre é/bin/bash
. Os#!/bin/bash
scripts antigos não funcionam no NixOS , por exemplo.Se você usar
env
como demonstrado acima, você não pode fornecer um argumento, como-e
parabash
(tanto quanto eu sei). Mas você pode fazer isso:fonte
env
uso não é bom, especialmente para scripts que executam python, porque você simplesmente não sabe se o padrãopython
é 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