2011-02-12 14 views
5

Ho il seguente comando nel mio .bashrc:alias Invocare bash in rake

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' 

E voglio eseguire il comando 'mfigpdf' nel mio Rakefile:

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

Ma nessuno di tesi le attività sta funzionando. Potrei semplicemente copiare il comando nel rakefile di inserirlo in un file shellscript, ma ho un codice duplicato.

Grazie per il vostro aiuto!

Matthias

+1

Perché non dichiarare questo alias come una funzione nel file rake? Avrai tutto il potere del rubino a tua disposizione.Scusa, faccio tutto in ruby ​​e vedo che stai usando il rake, ecco perché non posso fare a meno di chiederti. –

risposta

1

Dovete ottenere il tuo .bashrc per caricare che gli alias, ma penso che rubino gira su sh che pretende molto utilizzare il comando source, ma la '' command.I credere che questo dovrebbe funzionare:

`. /path/to/.bashrc `

+0

Ancora non funziona, Fernando ma grazie per il tuo aiuto. –

3

sh mfigpdf cercherà di eseguire uno script di shell con quel nome, è necessario utilizzare sh -c mfigpdf invece.

È inoltre necessario forzare bash in modalità "shell interattiva" con il flag -i per abilitare l'espansione dell'alias e caricare ~/.bashrc.

sh "bash -ci 'mfigpdf'" 

È possibile sostituire il vostro alias con una funzione di bash. Le funzioni sono anche espanse in modalità non interattiva, quindi si può solo fonte ~/.bashrc invece:

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

Ci sono tre problemi qui:

  • È necessario source ~/.profile, o dovunque gli alias sono memorizzati, in la subshell.
  • È necessario chiamare shopt -s expand_aliases per abilitare gli alias in una shell non interattiva.
  • È necessario eseguire entrambe queste operazioni su una riga separata dalla chiamata effettiva all'alias. (Per qualche ragione, l'impostazione expand_aliases non funziona per gli alias sulla stessa riga di input, anche se si utilizza un punto e virgola Vedere this answer..)

Quindi:

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

dovrebbe funzionare.

Tuttavia, si consiglia di utilizzare una funzione bash anziché un alias. Così il vostro bash potrebbe essere:

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 
} 

E la tua rubino:

system 'source ~/.profile; mfigpdf' 

La funzione si comportano sostanzialmente nello stesso modo come l'alias in una shell interattiva, e sarà più facile chiamare in un non- shell interattiva.

+0

Questa è un'ottima risposta, ma ciò che manca ancora è la manutenzione dell'ambito della shell. Ogni cmd di shell che utilizza un alias deve avvenire su una riga e senza altro rubino intermedio. –