ver variable una script resultado pasar parametros guardar funciones entorno cómo con comando bash scope environment-variables current-dir

una - variables en bash



Ámbito variable de entorno basado en directorio-¿Cómo implementar? (7)

¿Qué hay de envolver su script con una función (la función se puede colocar en su archivo bash profile / bashrc en el sistema para que esté disponible para todos los usuarios)?

myscript () { case $PWD in /path/to/foo) path/to/myscript --var1=$VAR1 ;; /path/to/bar) path/to/myscript --var2=$VAR1 ;; *) ;; case }

Por lo tanto, la función myscript llamará al "myscript" real sabiendo qué hacer en función del directorio de trabajo actual.

Toma esto como un ejemplo:

hmontoliu@ulises:/tmp$ myscript () { case $PWD in /tmp) echo I/'m in tmp;; /var) echo I/'m in var;; *) echo I/'m neither in tmp nor in bar; esac; } hmontoliu@ulises:/tmp$ myscript I''m in tmp hmontoliu@ulises:/tmp$ cd /var hmontoliu@ulises:/var$ myscript I''m in var hmontoliu@ulises:/var$ cd /etc hmontoliu@ulises:/etc$ myscript I''m neither in tmp nor in bar

Tengo un conjunto de herramientas que necesito para pasar parámetros en función del proyecto en el que estoy trabajando. Me gustaría poder establecer automáticamente un par de variables de entorno basadas en el directorio actual. Así que cuando cambié de directorio, también cambiarían mis variables de env de uso común. Ejemplo:

Veamos el directorio actual es foo, entonces si lo hago:

~/foo$ ./myscript --var1=$VAR1

VAR1 tendría algún valor basado en foo.

Entonces, digamos que cambié al directorio de barras. Si lo hago:

~/bar$ ./myscript --var1=$VAR1

VAR1 ahora debería tener algún valor basado en barras.

¿Es eso posible? ¿Cómo?


Esto no es algo que se admita directamente con las características integradas de bash o cualquier otra shell común. Sin embargo, puedes crear tu propio comando "cd" que hará lo que quieras. Por ejemplo, podría alias cd para hacer el cd y luego ejecutar un script especial (por ejemplo: ~ / bin / oncd). Ese script podría buscar el nuevo directorio en una base de datos y ejecutar algunos comandos, o ver si hay un archivo especial (por ejemplo: .env) en el directorio y cargarlo, etc.


Esto no es bonito, pero puede usar una combinación de variables de entorno exportadas y el valor de $PWD .

Por ejemplo:

export VAR1=prefix export prefix${HOME////_}_foo=42 export prefix${HOME////_}_bar=blah

Luego, myscript solo necesita myscript eval echo /${$VAR1${PWD////_}} para obtener el valor basado en el directorio.


Hago este tipo de cosas mucho. Creo varios archivos por lotes con nombres idénticos en directorios donde los necesito que solo establecen las variables y llaman al script común. Incluso tengo un archivo por lotes que crea los otros archivos pequeños.


Hay una guía que le ayuda a hacer estas cosas con mucha facilidad y de una manera elegante. Simplemente defina un archivo .envrc en el directorio de su proyecto con todas las variables env necesarias y lo obtendrá como fuente una vez que ingrese en esa carpeta.


He escrito otra implementación de esto, que es algo similar a ondir. En realidad no sabía sobre ondir cuando comencé a trabajar en ello. Sin embargo, hay algunas diferencias clave que pueden ser útiles.

  • smartcd está escrito completamente en shell y es totalmente compatible con bash y zsh, incluso las opciones más esotéricas

  • smartcd ejecutará los scripts hasta la jerarquía de directorios hasta su ancestro común, no solo para los dos directorios que está ingresando y saliendo. Esto significa que puede tener un script ~ / foo que se ejecutará ya sea que "cd ~ / foo" o "cd ~ / foo / bar"

  • tiene "ocultación de variables", que es una forma más automática de tratar con las variables de su entorno, mientras que ondir requiere que elimine y / o restablezca sus variables de forma explícita y manual

  • smartcd puede trabajar con "autocd" activado al enganchar su comando de solicitud (PROMPT_COMMAND en bash, precmd en zsh)

Puede encontrar smartcd en https://github.com/cxreg/smartcd


ondir programa ondir permite especificar acciones para ejecutar cuando ingresa y deja directorios en una terminal