0 votos

Configuración del comando env para bash scripts

Estoy usando Big Sur para el trabajo. Quiero escribir un bash script que utilice algunas características modernas de bash.

El golpe que viene con el Big Sur es bastante antiguo:

$ /bin/bash --version
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin20)

Así que en instalé una versión posterior con brew:

$ /usr/local/bin/bash --version
GNU bash, version 5.1.8(1)-release (x86_64-apple-darwin20.3.0)

Esta versión tiene las características que quiero. Sin embargo, quiero que el script sea multiplataforma, por lo que codificar esta ruta al principio de script hace que no funcione en nuestro entorno de nube, y en ciertas máquinas de otros desarrolladores:

#!/usr/local/bin/bash

Investigando, he encontrado que una forma estándar de hacer un script multiplataforma es usar esto para obtener una ubicación bash:

#!/usr/bin/env bash

Que permite al usuario definir una ubicación para bash. Sin embargo, ¡no he podido conseguir que el comando funcione en mi entorno local!

Este comando no devuelve nada espero que devuelva la ruta completa a un bash. Ni siquiera devuelve la ruta al bash por defecto del sistema.

$ /usr/bin/env bash

He añadido /usr/local/bin/bash a mi .profile pero parece que no ha funcionado.

$ cat .profile 
export PATH="/usr/local/sbin:/usr/local/bin/bash:$PATH"

¿Cómo configuro mi entorno, shell o lo que sea para que /usr/bin/env da la ruta de acceso a /usr/local/bin/bash ?

Estoy usando Big Sur 11.6.4 con Terminal 2.11.

3voto

Mark Puntos 6

Espero que devuelva la ruta completa a un bash

Su expectativa es incorrecta. /usr/bin/env bash lanza un nuevo shell bash interactivo.

Demostrando:

$ echo $$
14303
$ /usr/bin/env bash
$ echo $$
14339

Su PATH debe contener el archivo directorio donde se encuentra bash.


Un poco fuera de tema: si su bash script contiene características que no están presentes en la versión 3.2 (por ejemplo, matrices asociativas), puede añadir una aserción a su código para abortar antes de tiempo:

if (( BASH_VERSINFO[0] < 4 )); then
  echo "This code needs at least bash version 4" >&2
  exit 1
fi

O suponga que necesita al menos la versión 4.4:

if (( BASH_VERSINFO[0] * 10 + BASH_VERSINFO[1] < 44 )); then
  echo "This code needs at least bash version 4.4" >&2
  exit 1
fi

2voto

yoliho Puntos 340

Tienes que mirar algunos tutoriales de Unix para mejorar tus conocimientos de Unix. Cualquier decnto te explicará cómo funciona $PATH y cómo añadirlo.

Lo importante a tener en cuenta aquí es que los elementos de $PATH son directorios, no archivos. Lo que hace /usr/bin/env es tomar su primer argumento (bash en este caso) y ver si está en cada directorio de $PATH empezando por la izquierda. Así que para encontrar y ejecutar /usr/local/bin/bash necesitas tener /usr/local/bin en tu $PATH y eso tiene que estar antes de /bin que contiene el bash de Apple así que el comando que necesitas en tu ~/.profile (en realidad creo que debería estar en ~/.bash_profile - incluso entonces lee documentación de bash para ver que esta no es la recomendación completa de los autores de bash pero todo el mundo en la web parece usar esto) es

export PATH="/usr/local/sbin:/usr/local/bin:$PATH"

En realidad yo haría más y usaría zsh como shell ya que eso lo mantiene actualizado Apple y así no tienes que instalar software extra en tu mac y sería más fácil de ejecutar en las máquinas de tus colegas de trabajo.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X