¿Hay algún Bash
shebang 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/bash
en OpenBSD.Respuestas:
Debe usar
#!/usr/bin/env bash
para la portabilidad : diferentes * nixes colocadosbash
en diferentes lugares, y el uso/usr/bin/env
es una solución alternativa para ejecutar el primerobash
encontrado en elPATH
. Ysh
no lo esbash
.fuente
/bin/sh
, etc.).bash
no vive en/bin
todos los sistemas.alias shebang='echo "#!/usr/bin/env bash"'
ahora solo tengo que abrir el terminal y escribir shebang en lugar de ir aquí.env
esté en/usr/bin/env
. De hecho, podría estar en/bin/env
cualquier lugar, siempre que esté en el camino. Podría estar en/dummy/env
si/dummy
está adentroPATH
. Shebang no está definido en POSIX, por lo que podría hacer que se#!stop toaster
inicie la máquina de café USB y cumplir con POSIX. Por#!/usr/bin/env bash
lo tanto, no es particularmente mejor que#!/bin/bash
, podría ser menos portátil dependiendo./usr/bin/env
existe en más máquinas que cualquiera de/bin/bash
xor/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/sh
generalmente 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 algunasbash
caracterí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
,bash
en cierta medida se comporta como estándar POSIXsh
(ver también los documentos de GNU sobre esto).fuente
/bin/sh
a ninguna parte/usr
ya que eso dificultaría la ejecución de los scripts de inicio antes de que/usr
se monte./bin
y/sbin
durante años solo he sido enlaces simbólicos por defecto, hacia/usr/bin
y/usr/sbin
, por lo que en ese contexto/bin/sh
hay un enlacebash
y directorio es/usr/bin
. Pero corregiré lo anterior.Recomiendo usar:
No es 100% portátil (algunos sistemas se ubican
bash
en una ubicación distinta a/bin
), pero el hecho de que muchos scripts existentes usan#!/bin/bash
presiones de varios sistemas operativos para hacer/bin/bash
al menos un enlace simbólico a la ubicación principal.La alternativa de:
ha sido sugerido, pero no hay garantía de que el
env
comando esté en/usr/bin
(y he usado sistemas donde no está). Además, este formulario usará la primera instancia debash
en los usuarios actuales$PATH
, que podría no ser una versión adecuada del shell bash.(Pero
/usr/bin/env
debería funcionar en cualquier sistema razonablemente moderno, ya sea porqueenv
está/usr/bin
o 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
(bash
es/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
env
comando 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
man
páginas parabash
:y
env
:Nota: en Debian y los sistemas basados en Debian, como Ubuntu,
sh
están vinculados adash
notbash
. 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/sh
enlace 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/bash
fuente
pkg_add
, entonces está ubicado en/usr/local/bin
, que puede no estar en ruta.POSIX
Qué tal una característica?