2012-06-30 23 views
11

Tengo alias en un archivo ~/.bash_aliases en un servidor ubuntu remoto. El archivo se carga en la forma estándar de un archivo ~/.bashrc, así:Invocar alias de bash en scripts Fabric

if [ -f ~/.bash_aliases ]; then 
    . ~/.bash_aliases 
fi 

Eso ~/.bashrc archivo a su vez se carga (también en una forma estándar) desde un archivo ~/.profile que se parece a esto:

if [ "$BASH" ]; then 
    if [ -f ~/.bashrc ]; then 
    source ~/.bashrc 
    echo ".profile loaded .bashrc" 
    fi 
fi 
mesg n 

He encontrado que mis alias no estaban disponibles en mis comandos de fábrica, por ej. cuando hago esto en un script tela:

run("aliased_command") 

consigo esta salida:

run: aliased_command 
out: .profile loaded .bashrc 
out: /bin/bash: aliased_command: command not found 
Fatal error: run() encountered an error (return code 127) while executing 'aliased_command' 

Ahora me las arreglé para reproducir este exterior de la tela por la tala en el servidor con ssh, y en ejecución:

~# /bin/bash -l -c aliased_command 

de la cáscara (nb /bin/bash -l -c es por defecto de tejido, ver here) consigo la misma salida:

.profile loaded .bashrc: 
/bin/bash: aliased_command: command not found 

Después de un poco de búsqueda en los temas relacionados, leí en alguna parte que no se exportan los alias de conchas no interactivas, y luego me las arreglé para solucionar este problema utilizando /bin/bash -l -c -i (-i conjuntos de fiesta a modo interactivo).

Luego añade lo siguiente a mi fabfile.py:

env.shell = "/bin/bash -l -c -i" 

Ahora puedo utilizar alias en mis comandos de tela ... simplemente genial!


Así que mis preguntas son:

  • ¿Hay algún problema con esta solución? Si es así, ¿qué debería estar haciendo?

  • ¿Alguien más tiene un problema al ejecutar alias en sus archivos fabfiles?

  • ¿Hay alguna razón obvia por la que podría tener este problema y otros no?

  • ¿Alguien me puede indicar enlaces, etc. que describen este problema y una resolución? Y también explican cómo los encontraron ...:)

Respuesta

23

Aquí está la respuesta rápida a la cuestión principal, para salvar a alguien leer mi pregunta larga, acaba de añadir

env.shell = "/bin/bash -l -i -c" 

a su fabfile .py y deberías poder usar alias en tus comandos fabric ¡simplemente genial!

+0

Creo que la mejor solución para el problema que la mayoría de las personas que vienen aquí va a intentar resolver (suponiendo que no haya un problema importante al usar -i). Sin embargo, las otras respuestas fueron bastante útiles para mí para las preguntas específicas formuladas, por lo que le agradezco amablemente y he actualizado sus respuestas según corresponda. – JobJob

5

Sí, está perfectamente en lo cierto de que los alias no son expandidos por el shell bash en sesiones no interactivas.

Vea la sección de alias en página del manual: http://linux.die.net/man/1/bash

Alias ​​no se expanden cuando el proyectil no es interactivo, a menos que los expand_aliases shell opción se establece utilizando shopt (véase la descripción de shopt bajo INTERNAS DEL SHELL COMANDOS abajo).

Para permitir que esto suceda en una sesión no interactiva, incluya esto en su .profile.

shopt -s expand_aliases 

Esto hará que los alias estén disponibles en sesiones no interactivas y sus scripts de tela sin recurrir a sesiones interactivas.

+1

Bien, eso tiene sentido, pero por alguna razón esto no funciona para mí, después de agregar lo anterior a mi .profile, todavía obtengo el comando no encontrado para todos los comandos de alias en mi fabfile si no uso -i . ¿Ves algún problema con el uso de la bandera de bash -i en mi fabfile? – JobJob

2

Sospecho que el razonamiento detrás del comportamiento de bash de no exportar alias es que los alias están diseñados principalmente para proporcionar un mecanismo para que los usuarios de shell interactivos definan atajos rápidos o abreviaturas. En sus secuencias de comandos, debe utilizar los comandos completos (es decir, ls -l en lugar de ll) para la legibilidad. No haga que la gente aprenda todos sus alias para leer la fuente de su proyecto. Si sus alias son realmente cruciales, considere la posibilidad de crear scripts de shell independientes o, al menos, funciones de shell. Creo que le resultará extremadamente raro usar alias en un código fuente no interactivo, y quizás debería reconsiderar su implementación.

+0

Sí, creo que esto es lo que esperaba, podría ser el caso, y se ajusta a mi evidencia de que no muchos otros tienen este problema, ¡salud! Habiendo dicho eso, la mayoría de nuestras cosas están en funciones, y aparentemente son inaccesibles también ... Así que creo que voy a tener que seguir con -i por ahora, con los comentarios apropiados sobre cada función/alias en mi archivo de fab. – JobJob