2011-05-01 22 views
18

Tengo un conjunto de herramientas que necesito pasar parámetros dependiendo 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é entre directorios, mis archivos de uso común también cambiarían. Ejemplo: directorio actualAlcance de variable de entorno basado en directorio: ¿cómo implementarlo?

Vamos foo es, por lo tanto si lo hago:

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

Q1 tendría algún valor en función foo.

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

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

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

¿Es esto posible? ¿Cómo?

Respuesta

16

el programa ondir le permite especificar las acciones a ejecutar cuando entrar y salir de directorios en un terminal

+1

Interesante que alguien tenía que hacerlo. Es bueno que alguien lo haya hecho. –

+0

Esto es exactamente lo que estaba buscando. ¡Gracias! – Gatis

0

Hago este tipo de cosas mucho. Creo varios archivos por lotes de nombre idéntico 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.

2

Esto no es algo que se apoya directamente con las funciones integradas de fiesta o cualquier otro tejido común. Sin embargo, puedes crear tu propio comando "cd" que hará lo que quieras. Por ejemplo, puede 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 (ej .: .env) en el directorio y cargarlo, etc.

0

Esto no es bonito, pero puede use 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 

Entonces myscript sólo necesita eval echo \${$VAR1${PWD////_}} para llegar al valor basado directorio.

0

Qué tal envolver su script con una función (la función puede colocarse en su perfil bash/archivo 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 verdadero "myscript" sabiendo qué hacer en función del directorio de trabajo actual.

tomar esto como un ejemplo:

[email protected]:/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; } 
[email protected]:/tmp$ myscript 
I'm in tmp 
[email protected]:/tmp$ cd /var 
[email protected]:/var$ myscript 
I'm in var 
[email protected]:/var$ cd /etc 
[email protected]:/etc$ myscript 
I'm neither in tmp nor in bar 
8

he escrito otra implementación de esta, que es algo similar a ondir. No sabía nada sobre ondir cuando comencé a trabajar en él. Sin embargo, existen algunas diferencias clave que pueden ser útiles.

  • SmartCD está escrito completamente en la cáscara, y es totalmente compatible con bash y zsh, incluso las opciones más esotéricos

  • SmartCD va a ejecutar secuencias de comandos hasta el fondo y hasta la jerarquía de directorios a su común ancestro, no solo para los dos directorios que está ingresando y saliendo. Esto significa que puede tener un script ~/foo que se ejecutará si "cd ~/foo" o "cd ~/foo/bar"

  • tiene "almacenamiento variable", que es una forma más automática de tratar con las variables de entorno, mientras que ondir requiere que se quite de forma explícita y de forma manual y/o restablecer las variables

  • SmartCD puede trabajar con "autocd" encendidos enganchando el símbolo del sistema (PROMPT_COMMAND en bash, precmd en zsh)

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

+0

smartcd es muy bueno, gracias! –

4

Hay direnv que le ayuda a hacer esto de una forma muy fácil y elegante. Simplemente defina un archivo .envrc en el directorio de su proyecto con todas las variables de env necesarias y lo fuente una vez que ingrese en esa carpeta.