我的.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
答案 0 :(得分:5)
这里有三个问题:
source ~/.profile
或存储别名的任何位置。shopt -s expand_aliases
以在非交互式shell中启用别名。所以:
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
`