2011-02-12 13 views
5

mam następujące polecenie w moim .bashrc:Wywoływanie bash aliasy prowizji

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' 

I chcę, aby wykonać polecenie 'mfigpdf' w moim Rakefile:

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

Ale żadna z prac zadania działają. Mogę po prostu skopiować polecenie z pliku rake, wstawić je do pliku skorupy, ale mam zduplikowany kod.

Dzięki za pomoc!

Matthias

+1

Dlaczego nie zadeklarować tego aliasu jako funkcji w pliku rake? Będziesz miał pełną moc ruby ​​do swojej dyspozycji.Przepraszam, robię wszystko w rubinach i widzę, że korzystasz z prowizji, dlatego nie mogłem ci pomóc. –

Odpowiedz

1

Trzeba pozyskać .bashrc załadować że aliasy, ale myślę, że rubin działa na sh, że nie robi użyć polecenia source ale „” command.I uwierzyć to powinno działać:

`. /path/to/.bashrc `

+0

Nadal nie działa, Fernando, ale dzięki za twoją pomoc. –

3

sh mfigpdf spróbuje uruchomić skrypt powłoki o tej nazwie, trzeba użyć sh -c mfigpdf zamiast.

Musisz również wymusić bash w trybie "powłoki interaktywnej" za pomocą flagi -i, aby umożliwić rozwinięcie aliasu i załadowanie ~/.bashrc.

sh "bash -ci 'mfigpdf'" 

Możesz zamienić swój alias na funkcję basha. Funkcje są również rozbudowany w trybie non-interactive, więc można tylko źródło ~/.bashrc zamiast:

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

Istnieją trzy problemy:

  • Trzeba source ~/.profile, lub tam, gdzie przechowywane są pseudonimy, w podpowłoki. Aby uzyskać aliasy w nieinteraktywnej powłoce, należy zadzwonić pod numer shopt -s expand_aliases.
  • Musisz wykonać oba te ustawienia na osobnej linii z faktycznego połączenia z aliasem. (Z jakiegoś powodu, ustawienie expand_aliases nie działa dla aliasów na tej samej linii wejścia, nawet jeśli używasz średników Zobacz this answer..)

Więc:

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

powinno działać.

Zalecam jednak użycie funkcji bash zamiast aliasu. Więc bash będzie:

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 
} 

i Twojego Ruby

system 'source ~/.profile; mfigpdf' 

Funkcja będzie się zachowywał w zasadzie tak samo jak aliasu w interaktywnej powłoki, a łatwiej będzie wezwać nie- interaktywna powłoka.

+0

To jest świetna odpowiedź, ale wciąż brakuje w niej zachowania zakresu powłoki. Każda cmd powłoki przy użyciu aliasu musi się zdarzyć w jednej linii i bez innych rubinów pośrednich. –