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

时间:2014-01-15 10:42:10

标签: 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 $@ &")的情况下进行设置,但后来我得到了缺少的参数。我尝试创建一个包含新var中所有内容的字符串,但后来我看到了新的var的名称。我尝试将其重定向到一个文件并将其作为脚本运行,但后来我看到了该文件的名称。我尝试了exec,但我得到了相同的结果。我尝试使用带参数的函数,但是我遇到了很多错误而没有结果(我可能做错了)。

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

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

将Red Hat 6.0与GNOME 2.28.2一起使用。这是我的工作场所,所以我不能改变发行版或类似的东西。

谢谢!

2 个答案:

答案 0 :(得分:2)

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

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

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

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

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

答案 1 :(得分:1)

您不能将参数变量放在别名中。你需要一个功能:

meld() { command meld "$@" & }
tkdiff() { command tkdiff "$@" & }

如果您不想要大量相同的功能,请生成它们:

# automatically background the following commands
for cmd in meld tkdiff; do
    eval "$cmd () { command $cmd \"\$@\" & }"
done

要使用别名执行您想要的操作,您可能需要执行以下操作:

alias meld='run_bg meld'
run_bg () {
    local cmd=$1
    shift
    command $cmd "$@" &
}
# or, less clear but the same functionality:
# run_bg () { command "$@" & }