Вызов псевдонимов bash в граблях - PullRequest
5 голосов
/ 12 февраля 2011

У меня есть следующая команда в моем .bashrc:

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'

И я хочу выполнить команду 'mfigpdf' в моем Rakefile:

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

Но ни одна из этих задачработает.Я мог бы просто скопировать команду из файла rakefile и вставить ее в файл шеллскрипта, но затем я продублировал код.

Спасибо за вашу помощь!

Matthias

Ответы [ 3 ]

5 голосов
/ 15 марта 2011

Здесь есть три проблемы:

  • Вам нужно source ~/.profile, или где хранятся ваши псевдонимы, в подоболочке.
  • Вам нужно позвонить shopt -s expand_aliases длявключить псевдонимы в неинтерактивной оболочке.
  • Вы должны сделать оба этих действия на отдельной строке от фактического вызова псевдонима.(По какой-то причине установка expand_aliases не работает для псевдонимов в той же строке ввода, даже если вы используете точки с запятой. См. этот ответ .)

Итак:

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

Должно работать.

Однако я бы рекомендовал использовать функцию bash, а не псевдоним.Таким образом, ваш bash будет:

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
}

А ваш ruby:

system 'source ~/.profile; mfigpdf'

Функция будет вести себя в основном так же, как псевдоним в интерактивной оболочке, и ее будет проще вызыватьв неинтерактивной оболочке.

3 голосов
/ 13 марта 2011

sh mfigpdf попытается запустить сценарий оболочки с этим именем, вместо этого вы должны использовать sh -c mfigpdf.

Вы также должны принудительно заставить bash перейти в режим "интерактивной оболочки" с флагом -iчтобы включить расширение псевдонимов и загрузить ~/.bashrc.

sh "bash -ci 'mfigpdf'"

Вы можете заменить свой псевдоним функцией bash.Функции также расширяются в неинтерактивном режиме, поэтому вы можете просто набрать ~/.bashrc вместо:

sh "bash -c '. ~/.bashrc ; mfigpdf'"
1 голос
/ 12 февраля 2011

Для загрузки псевдонимов вы должны указать исходный код .bashrc, но я думаю, что ruby ​​работает на sh, который не использует команду source, а '.'команда. Я считаю, что это должно работать:

`. /path/to/.bashrc `

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...