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/foocomienza con#!/bin/bash, entonces ejecutar/path/to/foo arg1 arg2es 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 -xbash recibiría el argumento de cinco caracteres-e -x(un error de sintaxis) en lugar de dos argumentos-ey-x.Para el shell Bourne
shy los shells derivados como POSIX sh, bash, ksh y zsh:-esignifica que si algún comando falla (lo que indica al devolver un estado distinto de cero), el script finalizará de inmediato.-xhace que el shell imprima un seguimiento de ejecución.Otros programas pueden entender estas opciones pero con diferentes significados.
fuente
Son opciones pasadas para
bashverhelp setmás información, en este caso:fuente
-exambasman 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
envpara encontrar elbashejecutable, que no siempre está en/bin/bash. Los#!/bin/bashscripts antiguos no funcionan en NixOS , por ejemplo.Si usa
envcomo se demostró anteriormente, no puede proporcionar un argumento como-eabash(que yo sepa). Pero puedes hacer esto en su lugar:fuente
envuso no es bueno especialmente para los scripts que ejecutan python porque simplemente no sabe si el valor predeterminadopythones 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