Lo he visto en varios lugares, incluidas las recomendaciones en este sitio ( ¿Cuál es el Bash shebang preferido? ), Para usar #!/usr/bin/env bash
con preferencia #!/bin/bash
. Incluso he visto a una persona emprendedora sugerir que el uso #!/bin/bash
era incorrecto y que la funcionalidad bash se perdería al hacerlo.
Dicho todo esto, uso bash en un entorno de prueba estrictamente controlado donde cada unidad en circulación es esencialmente un clon de una sola unidad maestra. Entiendo el argumento de la portabilidad, aunque no es necesariamente aplicable en mi caso. ¿Hay alguna otra razón para preferir #!/usr/bin/env bash
a las alternativas y, suponiendo que la portabilidad fuera una preocupación, hay alguna razón para usarla que podría romper la funcionalidad?
env
posible que no se encuentre en/usr/bin
. Los comentarios de Shebang son una mala idea en mi humilde opinión. Si su intérprete de script predeterminado no maneja los comentarios shebang, es solo un comentario. Sin embargo, si sabe que el intérprete de guiones puede manejar comentarios shebang, y conoce la ruta de acceso a bash, no hay razón para no invocarlo usando su ruta absoluta a menos que la ruta sea demasiado larga (poco probable), o posiblemente pueda portar el guión a un sistema que no tiene bash ubicado en / bin. Por otra parte, las advertencias que mencioné anteriormente se aplican en ese caso ya que implica portabilidad./etc
o/bin/sh
.bash
es un complemento para la mayoría de los sistemas tipo Unix. Es solo Linux dondebash
está garantizado estar/bin
y muy probablemente también vinculado como/bin/sh
. Desde que Linux se convirtió en el Unix moderno de facto para muchas personas, se ha olvidado el hecho de que podrían existir sistemas distintos de Linux. En mi propia respuesta a continuación, asumí Linux porque dijistebash
. Muchas de las cajas BSD con las que he trabajado ni siquiera lo tenían instalado./bin/bash
. Bash no está instalado por defecto. Si lo quieres, tienes que hacerlopkg install bash
. Una vez instalado, se encuentra en/usr/local/bin/bash
. No hay nada instalado en/bin/bash
OpenBSD. Un shebang de#!/bin/bash
error de voluntad y#!/usr/bin/env bash
tendrá éxito.Respuestas:
#!/usr/bin/env
búsquedasPATH
parabash
, ybash
no siempre está en/bin
, sobre todo en los sistemas no Linux. Por ejemplo, en mi sistema OpenBSD, está dentro/usr/local/bin
, ya que se instaló como un paquete opcional.Si estás absolutamente seguro
bash
está/bin
y siempre lo estará, no hay ningún daño en ponerlo directamente en su shebang, pero lo recomendaría en contra porque los scripts y los programas tienen vidas más allá de lo que inicialmente creemos que tendrán.fuente
env
ubicación? POSIX no lo fuerza./usr/lib/sendmail
(o, más recientemente,/usr/sbin/sendmail
) disponible para procesar el correo, lo mejor para un sistema similar a Unix es tenerlo/usr/bin/env
porque el entorno de envio es una práctica muy común. Es una interfaz estándar de facto.env
, pero de alguna manera no tener una ubicación estándar (que puede ser un enlace suave)bash
. Sin mencionar, por qué entonces hashbang no acepta solo#!bash
, y usa elPATH
, en lugar de hacer exactamente lo mismo conenv
. Supongo que no es lo suficientemente confuso para los novatos.This mostly works because the path /usr/bin/env is commonly used for the env utility
aquí en.wikipedia.org/wiki/Shebang_(Unix) - Debemos confiar enenv
estar allí "probablemente" en todos los sistemas.env
estaba/bin
, no dentro/usr/bin
(no estoy seguro de cuál, probablemente SunOS 4). En estos días es muy probable/usr/bin/env
que esté disponible, solo por la popularidad del#!/usr/bin/env
hack.La ubicación estándar de bash es
/bin
, y sospecho que eso es cierto en todos los sistemas. Sin embargo, ¿qué pasa si no te gusta esa versión de bash? Por ejemplo, quiero usar bash 4.2, pero el bash en mi Mac está en 3.2.5.Podría intentar reinstalar bash
/bin
pero eso puede ser una mala idea. Si actualizo mi sistema operativo, se sobrescribirá.Sin embargo, podría instalar bash
/usr/local/bin/bash
y configurar mi RUTA para:Ahora, si lo especifico
bash
, no obtengo el viejo y sucio/bin/bash
, sino el más nuevo y brillante/usr/local/bin
. ¡Agradable!Excepto que mis scripts de shell tienen ese
!# /bin/bash
shebang. Por lo tanto, cuando ejecuto mis scripts de shell, obtengo esa versión antigua y pésima de bash que ni siquiera tiene matrices asociativas.Utilizando
/usr/bin/env bash
usará la versión de bash que se encuentra en mi RUTA. Si configuro mi RUTA, para que/usr/local/bin/bash
se ejecute, esa es la bash que usarán mis scripts.Es raro ver esto con bash, pero es mucho más común con Perl y Python:
/bin
?/usr/bin
?/opt/bin
? ¿Quién sabe? Usar#! /usr/bin/env perl
significaba que no tenía que saberlo.Y ahora por qué no deberías usar
#! /usr/bin/env bash
Cuando el camino está codificado en el shebang, tengo que correr con ese intérprete. Por lo tanto,
#! /bin/bash
me obliga a usar la versión predeterminada instalada de bash. Dado que las características de bash son muy estables (intente ejecutar una versión 2.x de un script de Python en Python 3.x) es muy poco probable que mi script de BASH en particular no funcione, y dado que este script y otros sistemas probablemente utilicen mi script de bash , el uso de una versión no estándar de bash puede tener efectos no deseados. Es muy probable que quiera asegurarme de que la versión estándar estable de bash se use con mi script de shell. Por lo tanto, probablemente quiero codificar la ruta en mi shebang.fuente
Para invocarlo
bash
es un poco exagerado. A menos que tengas múltiplesbash
archivos binarios como el suyo en ~ / bin, pero eso también significa que su código depende de que $ PATH tenga las cosas correctas.Sin
python
embargo, es útil para cosas como . Hay scripts de envoltura y entornos que conducen a alternativaspython
utilización de binarios .Pero no se pierde nada al usar la ruta exacta al binario siempre que esté seguro de que es el binario que realmente desea.
fuente
python
. He perdido la cuenta de la cantidad de lugares quepython
se pueden encontrar 😀/usr/bin/env
es más útil para Python, especialmente si usa virtualenv.Hay muchos sistemas que no tienen Bash
/bin
, FreeBSD y OpenBSD solo por nombrar algunos. Si su script está destinado a ser portátil a muchos Unices diferentes, es posible que desee usar en#!/usr/bin/env bash
lugar de#!/bin/bash
.Tenga en cuenta que esto no es cierto para
sh
; para scripts Bourne conformes I uso exclusivamente#!/bin/sh
, ya que creo que casi todos los Unix en la existencia tienesh
en/bin
.fuente
/bin
dir, ya veosh -> dash
. Vinculado simbólicamentedash
, revelando la naturaleza Debian de Ubuntu. Ejecute estas tres cadenas de comandos para darse cuenta de que todo se reduce a preferencias individuales:which bash
luego,which sh
luegowhich dash
.Preferiría envolver el programa principal en un script como el siguiente para verificar todos los
bash
disponibles en el sistema. Es mejor tener más control sobre la versión que usa.fuente
definitivamente es mejor porque encuentra la ruta ejecutable bash de la variable de entorno del sistema.
Vaya a su shell de Linux y escriba
Imprimirá todas sus variables de entorno.
Vaya a su script de shell y escriba
Imprimirá su ruta bash (de acuerdo con la lista de variables de entorno) que debe usar para construir su ruta shebang correcta en su script.
fuente