我想有条件地运行一个命令作为后台或前台进程,所以我写了这样的东西:
test $some_var; bg_suffix=&
long_command $bg_suffix
它不起作用,因为bg_suffix总是为空,无论它是否已被分配。
但是
test $some_var; bg_suffix="&"
long_command $bg_suffix
不起作用,因为现在bg_suffix被解释为字符串。
任何想法如何解决这个问题?谢谢!
答案 0 :(得分:3)
怎么样:
if [[ ${somevar} ]] ; then
long_command &
else
long_command
fi
或者,如果是长命令,则您不想输入两次:
long_command=insert your big honking command here
if [[ ${somevar} ]] ; then
${long_command} &
else
${long_command}
fi
顺便说一句,我希望你知道命令序列:
test ${condition}; x=2
无论test
结果如何,都会将x设置为2。你可能打算写:
test ${condition} && x=2
答案 1 :(得分:3)
inBackground () {
t=$1
shift
if $t; then
"$@"&
else
"$@"
fi
}
这可以让您执行以下操作:
inBackground false echo '$$'
inBackground true sleep 4
这解决了所有基于eval的解决方案都存在的问题:新的,有时甚至是不可能的引用规则。例如,尝试通过eval传递'$$'
。由于true
和false
对解析器不重要,因此它们可以在变量中,并且事情仍然有效。
当然,如果你想让shell metachars工作(比如你重定向i / o),那么eval会更好,或者你需要为命令定义一个过程,如果你定义了一个过程,你的问题就解决了:
complicated_command () {
sleep 3
echo replace this with something complex
}
do_background=true
$do_background && (complicated_command&) || complicated_command
答案 2 :(得分:2)
eval (long_command $bg_suffix)
使用bg_suffix =“&”
答案 3 :(得分:1)
我不知道为什么我无法评论,但无论如何
测试$ some_var; bg_suffix = “&安培;”
无论测试结果如何,都会导致设置bg_suffix。