Bash 3 predeterminado que reemplaza a shebang / bin / bash con brew instalado bash 4

4

Fondo

Bash 4 se instaló exitosamente usando homebrew y los pasos adicionales requeridos para hacer de bash 4 tu shell predeterminado. Muchas guías en la red con un simple google: Ejemplo Bash 4 guía de actualización para Mac

  • Ubicación de Bash 4.x (instalada a través de brew): /usr/local/bin/bash
  • Ubicación de Bash 3.2 (OSX predeterminado): /bin/bash

Problema

Scripts No puedo controlar / modificar el shebang , ya que afectaría a otros usuarios. A menos que tuviera que cambiar manualmente y luego revertir antes de comprometerme con el control de fuente. Otra opción es escribir: bash some_script_with_bin_bash_shebang.sh para forzar el uso del shell bash 4 predeterminado.

Solo necesito hacer esto para la funcionalidad Bash 4+, que es muy común ahora.

Pregunta

¿Alguien tiene una técnica genial, soluciones para el alias de una ruta de bash shebang así: #!/bin/bash a la nueva shell de bash 4 en /usr/local/bin/bash ?

¡Sin modificar obviamente el archivo! ^ _ ^ (por ejemplo, agregando #!/usr/bin/env bash )

    
pregunta RST 15.01.2018 - 23:57

2 respuestas

2

En primer lugar, podría considerar simplemente reemplazar /bin/bash con una versión más actualizada.

En segundo lugar, si no está cómodo anulando su garantía al hacer eso, y si ya tiene un problema con un script existente, omita su línea #! invocándola como:

/usr/local/bin/bash /path/to/script.bash args...

(Puedes usar bash en lugar de /usr/local/bin/bash si tu $PATH está en el orden correcto)

En tercer lugar, si este script es específico para los dispositivos Apple y debe tener Bash versión 4, siempre configúrelo explícitamente en #!/usr/local/bin/bash , ya que no hay ningún beneficio al configurarlo en otra cosa.

En cuarto lugar, considere usar enlace : tenga en cuenta que necesita la versión "fuente" del script para no estar en /usr/local/bin ; directamente en tu fuente de repo sería ideal.

Fuente vs Implementación

Su consulta sobre la configuración de la línea #! en el repositorio de source resalta una falta de comprensión muy frecuente sobre los scripts: la idea de que un script, simplemente porque es "texto", no debería ser necesario "Preparado para usar" en cualquier sentido.

Para otros tipos de programas es obvio: tienen que ser compilados. Y si son scripts de Python o Perl grandes, necesitan un paquete o instalador que incluya las dependencias de cualquier módulo.

Pero incluso un script de shell necesita, como mínimo, tener su propiedad y permisos establecidos, y ser colocado en un directorio bin . Por lo general, esto ocurre cuando se construye un paquete para una clase de dispositivo o cuando el script se instala en un dispositivo de destino. Este es también el momento adecuado para configurar la línea #! para que coincida con el entorno de implementación.

Yo no recomiendo #!/usr/bin/env bash

La promoción generalizada de #!/usr/bin/env debilita ligeramente la seguridad general, pero de una manera que no es probable que afecte a las personas que la escriben, solo a los usuarios en algún lugar del camino. Por lo tanto, no lo recomiendo; de hecho, predigo que con el tiempo volverá y morderá a sus clientes, a los clientes de sus clientes, oa los clientes de sus clientes ...

Se promueve como "portátil", pero eso no es realmente cierto: los dispositivos Android y OpenWRT ni siquiera tienen /usr mucho menos /usr/bin/env , por lo que es bastante inútil allí. Entonces, en la práctica, los principales beneficiarios son los usuarios de Apple.

Si la secuencia de comandos requiere una nueva versión de bash, entonces la versión del sistema simplemente no funcionará, por lo que no tiene sentido usarla como alternativa. Si no necesita la versión más reciente, está bien arreglarlo como / bin / bash.

En resumen, si está implementando un script en Apple que requiere Bash versión 4, debería usar #!/usr/local/bin/bash , ya sea cuando compile el script en un paquete instalable, o cuando el script está instalado en un dispositivo en particular.

    
respondido por el Martin 13.03.2018 - 08:06
1

Esta es la razón principal en la actualidad para usar un shebang diferente:

#!/usr/bin/env bash

Esto usará el primer bash en el PATH, que probablemente será la última versión. Dado que / bin se encuentra en la ruta estándar ( getconf PATH ), esto disminuye con gracia para aquellos que no tienen un bash personalizado.

    
respondido por el grg 16.01.2018 - 00:09

Lea otras preguntas en las etiquetas