¿Hay algún Bashshebang objetivamente mejor que los demás para la mayoría de los usos?
#!/usr/bin/env bash#!/bin/bash#!/bin/sh#!/bin/sh -- etc.
Recuerdo vagamente hace mucho tiempo que escuché que agregar un guión al final evita que alguien pase un comando a su script, pero no puedo encontrar ningún detalle al respecto.

/usr/local/bin/bashen OpenBSD.Respuestas:
Debe usar
#!/usr/bin/env bashpara la portabilidad : diferentes * nixes colocadosbashen diferentes lugares, y el uso/usr/bin/enves una solución alternativa para ejecutar el primerobashencontrado en elPATH. Yshno lo esbash.fuente
/bin/sh, etc.).bashno vive en/bintodos los sistemas.alias shebang='echo "#!/usr/bin/env bash"'ahora solo tengo que abrir el terminal y escribir shebang en lugar de ir aquí.envesté en/usr/bin/env. De hecho, podría estar en/bin/envcualquier lugar, siempre que esté en el camino. Podría estar en/dummy/envsi/dummyestá adentroPATH. Shebang no está definido en POSIX, por lo que podría hacer que se#!stop toasterinicie la máquina de café USB y cumplir con POSIX. Por#!/usr/bin/env bashlo tanto, no es particularmente mejor que#!/bin/bash, podría ser menos portátil dependiendo./usr/bin/envexiste en más máquinas que cualquiera de/bin/bashxor/usr/bin/bash, por lo que un script que comienza con esta línea hará lo esperado en tantas máquinas como sea posible./bin/shgeneralmente es un enlace al shell predeterminado del sistema, que a menudo está activadobash, por ejemplo, los sistemas Debian son más livianosdash. De cualquier manera, el shell Bourne original essh, por lo que si su script usa algunasbashcaracterísticas específicas ([[ ]]pruebas de segunda generación, "Bourne Again sh") ( pruebas, matrices, varias cosas azucaradas, etc.), entonces debería ser más específico y usar el posterior . De esta manera, en sistemas donde bash no está instalado, su script no se ejecutará. Entiendo que puede haber una trilogía emocionante de películas sobre esta evolución ... pero eso podría ser un rumor.También tenga en cuenta que cuando se evoca como
sh,bashen cierta medida se comporta como estándar POSIXsh(ver también los documentos de GNU sobre esto).fuente
/bin/sha ninguna parte/usrya que eso dificultaría la ejecución de los scripts de inicio antes de que/usrse monte./biny/sbindurante años solo he sido enlaces simbólicos por defecto, hacia/usr/biny/usr/sbin, por lo que en ese contexto/bin/shhay un enlacebashy directorio es/usr/bin. Pero corregiré lo anterior.Recomiendo usar:
No es 100% portátil (algunos sistemas se ubican
bashen una ubicación distinta a/bin), pero el hecho de que muchos scripts existentes usan#!/bin/bashpresiones de varios sistemas operativos para hacer/bin/bashal menos un enlace simbólico a la ubicación principal.La alternativa de:
ha sido sugerido, pero no hay garantía de que el
envcomando esté en/usr/bin(y he usado sistemas donde no está). Además, este formulario usará la primera instancia debashen los usuarios actuales$PATH, que podría no ser una versión adecuada del shell bash.(Pero
/usr/bin/envdebería funcionar en cualquier sistema razonablemente moderno, ya sea porqueenvestá/usr/bino porque el sistema hace algo para que funcione. El sistema al que me referí anteriormente era SunOS 4, que probablemente no he usado en unos 25 años).Si necesita ejecutar un script en un sistema que no lo tiene
/bin/bash, puede modificar el script para que apunte a la ubicación correcta (eso es ciertamente inconveniente).He discutido las compensaciones con mayor profundidad en mi respuesta a esta pregunta .
Una actualización algo oscura: un sistema que uso, Termux , una capa de escritorio similar a Linux que se ejecuta en Android, no tiene
/bin/bash(bashes/data/data/com.termux/files/usr/bin/bash), pero tiene un manejo especial para soportar#!/bin/bash.fuente
Usar una línea shebang para invocar al intérprete apropiado no es solo para BASH. Puede usar el shebang para cualquier lenguaje interpretado en su sistema, como Perl, Python, PHP (CLI) y muchos otros. Por cierto, el shebang
(también puede ser dos guiones, es decir
--) finaliza las opciones de bash, todo lo que sea posterior se tratará como nombres de archivo y argumentos.El uso del
envcomando hace que su script sea portátil y le permite configurar entornos personalizados para su script, por lo tanto, los scripts portátiles deben usarO para cualquier idioma como Perl
Asegúrese de mirar las
manpáginas parabash:y
env:Nota: en Debian y los sistemas basados en Debian, como Ubuntu,
shestán vinculados adashnotbash. Como todos los scripts del sistema usansh. Esto permite que bash crezca y el sistema se mantenga estable, según Debian.Además, para mantener la invocación * nix como nunca uso extensiones de archivo en scripts invocados shebang, ya que no puede omitir la extensión de invocación en ejecutables como puede hacerlo en Windows. El comando de archivo puede identificarlo como un script.
fuente
Realmente depende de cómo escribas tus scripts de bash. Si su
/bin/shenlace simbólico a bash, cuando se invoca bash comosh, algunas características no están disponibles .Si desea funciones específicas de bash que no sean POSIX, use
#!/bin/bashfuente
pkg_add, entonces está ubicado en/usr/local/bin, que puede no estar en ruta.POSIXQué tal una característica?