Lo he visto en varios lugares, incluidas las recomendaciones en este sitio ( ¿Cuál es el Bash shebang preferido? ), Para usar #!/usr/bin/env bashcon preferencia #!/bin/bash. Incluso he visto a una persona emprendedora sugerir que el uso #!/bin/bashera 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 basha las alternativas y, suponiendo que la portabilidad fuera una preocupación, hay alguna razón para usarla que podría romper la funcionalidad?

envposible 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./etco/bin/sh.bashes un complemento para la mayoría de los sistemas tipo Unix. Es solo Linux dondebashestá garantizado estar/biny 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/bashOpenBSD. Un shebang de#!/bin/basherror de voluntad y#!/usr/bin/env bashtendrá éxito.Respuestas:
#!/usr/bin/envbúsquedasPATHparabash, ybashno 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
bashestá/biny 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
envubicació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/envporque 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 utilityaquí en.wikipedia.org/wiki/Shebang_(Unix) - Debemos confiar enenvestar allí "probablemente" en todos los sistemas.envestaba/bin, no dentro/usr/bin(no estoy seguro de cuál, probablemente SunOS 4). En estos días es muy probable/usr/bin/envque esté disponible, solo por la popularidad del#!/usr/bin/envhack.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
/binpero eso puede ser una mala idea. Si actualizo mi sistema operativo, se sobrescribirá.Sin embargo, podría instalar bash
/usr/local/bin/bashy 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/bashshebang. 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 bashusará la versión de bash que se encuentra en mi RUTA. Si configuro mi RUTA, para que/usr/local/bin/bashse 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 perlsignificaba que no tenía que saberlo.Y ahora por qué no deberías usar
#! /usr/bin/env bashCuando el camino está codificado en el shebang, tengo que correr con ese intérprete. Por lo tanto,
#! /bin/bashme 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
bashes un poco exagerado. A menos que tengas múltiplesbasharchivos binarios como el suyo en ~ / bin, pero eso también significa que su código depende de que $ PATH tenga las cosas correctas.Sin
pythonembargo, es útil para cosas como . Hay scripts de envoltura y entornos que conducen a alternativaspythonutilizació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 quepythonse pueden encontrar 😀/usr/bin/enves 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 bashlugar 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 tieneshen/bin.fuente
/bindir, 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 bashluego,which shluegowhich dash.Preferiría envolver el programa principal en un script como el siguiente para verificar todos los
bashdisponibles 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