在 rake 中调用 bash 别名

发布于 2024-10-17 06:12:45 字数 511 浏览 1 评论 0原文

我的 .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 文件中,但我有重复的代码。

感谢您的帮助!

马蒂亚斯

I have the following command in my .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'

And I want to execute the 'mfigpdf' command in my Rakefile:

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

But none of theses tasks is working. I could just copy the command in the rakefile of insert it in a shellscript file, but than I have duplicated code.

Thanks for your help!

Matthias

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

北方的巷 2024-10-24 06:12:45

这里存在三个问题:

  • 您需要在子 shell 中 source ~/.profile 或存储别名的任何位置。
  • 您需要调用 shopt -s Expand_aliases 以在非交互式 shell 中启用别名。
  • 您需要在实际调用别名的单独行上执行这两项操作。 (出于某种原因,即使使用分号,设置 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'

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

There are three problems here:

  • You need to source ~/.profile, or wherever your aliases are stored, in the subshell.
  • You need to call shopt -s expand_aliases to enable aliases in a non-interactive shell.
  • You need to do both of these on a separate line from the actual call to the alias. (For some reason, setting expand_aliases doesn't work for aliases on the same line of input, even if you use semicolons. See this answer.)

So:

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

Should work.

However, I would recommend using a bash function rather than an alias. So your bash would be:

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
}

And your ruby:

system 'source ~/.profile; mfigpdf'

The function will behave basically the same way as the alias in an interactive shell, and will be easier to call in a non-interactive shell.

烟沫凡尘 2024-10-24 06:12:45

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

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

sh "bash -ci 'mfigpdf'"

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

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

sh mfigpdf will try to run a shell script with that name, you have to use sh -c mfigpdf instead.

You also have to force bash into "interactive shell" mode with the -i flag in order to enable alias expansion and to load ~/.bashrc.

sh "bash -ci 'mfigpdf'"

You can replace your alias with a bash function. Functions are also expanded in non-interactive mode, so you could just source ~/.bashrc instead:

sh "bash -c '. ~/.bashrc ; mfigpdf'"
少跟Wǒ拽 2024-10-24 06:12:45

您必须获取 .bashrc 来加载该别名,但我认为 ruby​​ 在 sh 上运行,它不使用 source 命令,而是使用“.”。命令。我相信这应该有效:

`。 /path/to/.bashrc `

You have to source your .bashrc to load that aliases, but I think ruby runs on sh that doesnt use the source command but the '.' command.I believe this should work:

`. /path/to/.bashrc `

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文