2011-02-12 12 views
5

tengo el comando siguiente en mi .bashrc:alias Invocación de bash en el rastrillo

alias mfigpdf='for FIG in *.fig; do fig2dev -L pdftex "$FIG" "${FIG%.*}.pdftex"; done; 
       for FIG in *.fig; do fig2dev -L pstex_t -p "${FIG%.*}.pdftex" "$FIG" "${FIG%.*}.pdftex_t"; done' 

Y quiero ejecutar el comando 'mfigpdf' en mi Rakefile:

desc "convert all images to pdftex (or png)" 
task :pdf do 
    sh "mfigpdf" 
    system "mfigpdf" 
end 

Pero ninguna de las tesis tareas está funcionando. Podría simplemente copiar el comando en el archivo de búsqueda de insertarlo en un archivo de shellscript, pero no tengo código duplicado.

Gracias por su ayuda!

Matthias

+1

¿Por qué no declarar este alias como una función en el archivo de rake? Tendrás todo el poder del rubí a tu disposición.Lo siento, hago todo en ruby ​​y veo que estás usando rake, por eso no pude evitar preguntarte. –

Respuesta

1

Tienes que establecer el origen del Bashrc a cargar ese alias, pero creo que el rubí se ejecuta en sh que imposible utilizar el comando source pero el '' command.I creer que esto debería funcionar:

`. /path/to/.bashrc `

+0

Todavía no funciona, Fernando, pero gracias por su ayuda. –

3

sh mfigpdf se intenta ejecutar un script de shell con ese nombre, usted tiene que utilizar sh -c mfigpdf lugar.

También debe forzar bash en el modo "caparazón interactivo" con el indicador -i para habilitar la expansión de alias y cargar ~/.bashrc.

sh "bash -ci 'mfigpdf'" 

Puede reemplazar su alias con una función bash. Las funciones también se expanden en modo no interactivo, por lo que sólo podría fuente ~/.bashrc lugar:

sh "bash -c '. ~/.bashrc ; mfigpdf'" 
4

Hay tres problemas aquí:

  • Es necesario source ~/.profile, o donde se almacenan sus alias, en la subshell.
  • Debe llamar al shopt -s expand_aliases para habilitar los alias en un shell no interactivo.
  • Necesita hacer ambas cosas en una línea separada desde la llamada real al alias. (Por alguna razón, el establecimiento de expand_aliases no funciona para alias en la misma línea de entrada, incluso si se utiliza un punto y coma Ver this answer..)

Así:

system %{ 
    source ~/.profile 
    shopt -s expand_aliases 
    mfigpdf 
} 

debería funcionar.

Sin embargo, recomendaría usar una función bash en lugar de un alias. Por lo que su fiesta sería:

function mfigpdf() { 
    for FIG in *.fig; do 
    fig2dev -L pdftex "$FIG" "${FIG%.*}.pdftex" 
    done 
    for FIG in *.fig; do 
    fig2dev -L pstex_t -p "${FIG%.*}.pdftex" "$FIG" "${FIG%.*}.pdftex_t" 
    done 
} 

Y el rubí:

system 'source ~/.profile; mfigpdf' 

La función se comportará básicamente la misma forma que el alias en un shell interactivo, y será más fácil de llamar a un no caparazón interactivo.

+0

Esta es una gran respuesta, pero lo que aún falta es el mantenimiento del alcance del shell. Cada cmd de shell que utiliza un alias tiene que suceder en una línea, y sin otro rubí en el medio. –