Bash:如何从 env var 运行命令并在进程名称中显示其值

标签 bash background

有几个命令我想一直在后台运行。为此,我在我的 .bashrc 文件中添加了一个函数,它在后台运行一个带有参数的命令,并为我想要的命令创建了一些别名。

这是我的 .bashrc 中的一个片段:

alias tkdiff="CMD=tkdiff; run_bg"
alias meld="CMD=meld; run_bg"

# Run command in background
run_bg() {
    $CMD $@ &
}

问题是,当我使用这些命令时,如果我运行 jobs 命令或当其中一个进程完成时,我只能看到 $CMD $@,而且我看不到真正在运行或已完成运行的内容。

例如:

[ ***** ]$ meld; meld; meld
[1] 117438
[2] 117439
[3] 117440
[ ***** ]$ jobs
[1]   Running                 $CMD $@ &
[2]-  Running                 $CMD $@ &
[3]+  Running                 $CMD $@ &
[ ***** ]$ jobs
[1]   Done                    $CMD $@
[2]-  Done                    $CMD $@
[3]+  Done                    $CMD $@
[ ***** ]$

我尝试在没有函数的情况下进行设置 (alias meld="meld $@ &"),但后来我缺少参数。我尝试创建一个包含新变量中所有内容的字符串,但后来我看到了新变量的名称。我尝试将它重定向到一个文件中并将其作为脚本运行,但后来我看到的是文件名。我尝试使用 exec,但我得到了相同的结果。我尝试使用带有参数的函数,但我遇到了很多错误并且没有结果(我可能做错了什么)。

我知道我可以为每个命令编写一个函数,但这是一个糟糕的解决方案,我仍然将参数视为 $@

有没有办法查看变量的内容而不是它们的名称? 是否有更好/更简单的方法让特定命令始终在后台运行?

将 Red Hat 6.0 与 GNOME 2.28.2 结合使用。这是我的工作场所,所以我不能切换发行版或类似的东西。

谢谢!

最佳答案

我找到了一个解决方案。这是代码:

alias tkdiff="run_bg /usr/bin/tkdiff"
alias meld="run_bg /usr/bin/meld"

# Run command in background
run_bg {
    eval "$@ &"
}

Eval 在运行前将变量取消引用为字符串,因此文本完整显示。 它需要手动输入完整的命令路径,但这已经足够了。

感谢所有试图提供帮助的人!

关于Bash:如何从 env var 运行命令并在进程名称中显示其值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21135234/

相关文章:

css - 如何防止背景图像变得模糊

linux - 如何在 ubuntu 的 .desktop 文件中动态分配家庭用户名?

bash - PostgreSQL 与主管

php - SQL从脏数据集创建新数据库

WPF 重复图像背景

css - 大的非重复背景,需要预加载器来加载其中的一部分

linux - 使用 bash move 多个序列文件

linux - 杀死除一个 python 脚本和 grep 进程之外的所有 python 脚本

android - 我如何知道应用程序在 android 后台运行了多长时间?

CSS - 为什么我的背景颜色没有在 IE 中显示?