Tengo algunos scripts de bash que he configurado y que uso principalmente
#!/bin/bash
pero regularmente me encuentro con algunos que parecen
#!/bin/bash -e
#!/bin/bash -x
#!/bin/bash -ex
y así.
¿Alguien puede explicar el significado y los beneficios de estas opciones de shebang y si se aplican a otros shebangs?
Respuestas:
Si un script
/path/to/foo
comienza con#!/bin/bash
, entonces ejecutar/path/to/foo arg1 arg2
es equivalente a ejecutar/bin/bash /path/too/foo arg1 arg2
. Si la línea shebang es#!/bin/bash -ex
, es equivalente a ejecutar/bin/bash -ex /path/too/foo arg1 arg2
. Esta característica es administrada por el núcleo.Tenga en cuenta que solo puede tener un argumento de manera portátil en la línea shebang: algunos unices (como Linux) solo aceptan un argumento, por lo que
#!/bin/bash -e -x
bash recibiría el argumento de cinco caracteres-e -x
(un error de sintaxis) en lugar de dos argumentos-e
y-x
.Para el shell Bourne
sh
y los shells derivados como POSIX sh, bash, ksh y zsh:-e
significa que si algún comando falla (lo que indica al devolver un estado distinto de cero), el script finalizará de inmediato.-x
hace que el shell imprima un seguimiento de ejecución.Otros programas pueden entender estas opciones pero con diferentes significados.
fuente
Son opciones pasadas para
bash
verhelp set
más información, en este caso:fuente
-ex
ambasman 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: [...]
.Solo me gustaría mencionar una alternativa aún mejor, como en una versión más portátil:
El ejemplo anterior usa
env
para encontrar elbash
ejecutable, que no siempre está en/bin/bash
. Los#!/bin/bash
scripts antiguos no funcionan en NixOS , por ejemplo.Si usa
env
como se demostró anteriormente, no puede proporcionar un argumento como-e
abash
(que yo sepa). Pero puedes hacer esto en su lugar:fuente
env
uso no es bueno especialmente para los scripts que ejecutan python porque simplemente no sabe si el valor predeterminadopython
es la versión 2 o 3 y eso hace una gran diferencia para los scripts que necesitan una versión específica. Mejor ser explícito que astuto