在rake中调用bash别名

时间:2011-02-12 14:24:15

标签: rake

我的.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'

我想在我的Rakefile中执行'mfigpdf'命令:

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

但这些任务都没有奏效。我可以在rakefile中复制命令,将它插入一个shellscript文件中,但是我有重复的代码。

感谢您的帮助!

的Matthias

3 个答案:

答案 0 :(得分:5)

这里有三个问题:

  • 您需要在子shell中source ~/.profile或存储别名的任何位置。
  • 您需要调用shopt -s expand_aliases以在非交互式shell中启用别名。
  • 您需要在实际调用别名的单独行上执行这两项操作。 (由于某些原因,即使使用分号,设置expand_aliases也不适用于同一行输入的别名。请参阅this answer。)

所以:

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
}

你的红宝石:

system 'source ~/.profile; mfigpdf'

该函数的行为与交互式shell中的别名基本相同,并且在非交互式shell中更容易调用。

答案 1 :(得分:3)

sh mfigpdf将尝试运行具有该名称的shell脚本,您必须改为使用sh -c mfigpdf

您还必须使用-i标志强制bash进入“交互式shell”模式,以便启用别名扩展并加载~/.bashrc

sh "bash -ci 'mfigpdf'"

您可以使用bash函数替换别名。功能也在非交互模式下扩展,因此您只需要~/.bashrc来源:

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

答案 2 :(得分:1)

你必须使用你的.bashrc来加载这些别名,但我认为ruby运行在不使用source命令但是'。'的sh上。命令。我相信这应该有效:

`. /path/to/.bashrc`