2012-06-23 17 views
15

soy bastante nuevo para golpear, y quiero incluir un env para los alias de bash .. quiero hacer algo como lo siguiente¿Cómo incluyo una variable de entorno dentro de un alias para bash?

alias foo="bar $(baz)" 

para que yo pudiera hacer algo como lo siguiente

> baz=40 
> foo 

y foo se expandirán al comando bar 40. Actualmente, lo anterior no funciona porque $ (baz) se expande mientras se crea el alias. ¿Tengo que envolver esto dentro de una función o algo así?

Respuesta

31

Es necesario utilizar comillas simples (') para evitar la fiesta de la expansión de la variable al crear el alias:

$ alias foo='echo "$bar"' 
$ bar="hello" 
$ foo 
hello 
+1

También 'alias test = echo \ $ bar' (misma idea, la expansión se suprime) –

+4

Respuesta correcta, solo tenga cuidado aliasing' test', es un comando real. – Kevin

+4

'alias foo = 'echo" $ bar "''. La 'exportación' es innecesaria. – ormaaj

4

Alias ​​no tienen un "medio ambiente". Un alias es simplemente una sustitución de texto "tonto". En la pregunta, no se usa una variable de entorno, solo una variable de shell. Si desea usar el entorno, use una función. En este caso, no hay ventaja para un alias sobre una función.

$ alias foo='echo "$bar"' 
$ bar=hi foo 

Esto produce ninguna salida porque el entorno para establecer un simple comando no se aplica a las expansiones.

$ alias foo=$'eval \'echo "$bar"\'' 
$ bar=hi foo 
hi 

Si se utilizara una función en su lugar, no habría ningún problema.

$ foo() { echo "$bar"; } 
$ bar=hi foo 
hi 

En caso de duda, utilice siempre una función.

Editar

Técnicamente, lo anterior es bash-solamente. Hacer esto de una manera totalmente portátil es casi imposible.

En el tablero, mksh, modo POSIX fiesta, y otros proyectiles POSIX que puede hacer:

foo() { echo "$bar"; } 
bar=hi command eval foo 

Sin embargo, esto no va a funcionar en ksh93 o zsh. (Ya he informado de un error para ksh93 pero puede que nunca se solucione). En mksh y ksh93, en su lugar, debe definir funciones usando la palabra clave function, pero eso no es POSIX. No estoy al tanto de ninguna solución que funcione en todas partes.

Para empeorar las cosas, se están añadiendo excepciones adicionales a POSIX 2008-TC1, por lo que la forma en que funcionan las asignaciones de entorno será aún más complicada. Sugiero no usarlos a menos que realmente sepas lo que estás haciendo.

Cuestiones relacionadas