BASH:分配'&'将NOT变为字符串

时间:2009-11-19 02:36:49

标签: bash

我想有条件地运行一个命令作为后台或前台进程,所以我写了这样的东西:

test $some_var; bg_suffix=&
long_command $bg_suffix

它不起作用,因为bg_suffix总是为空,无论它是否已被分配。

但是

test $some_var; bg_suffix="&"
long_command $bg_suffix

不起作用,因为现在bg_suffix被解释为字符串。

任何想法如何解决这个问题?谢谢!

4 个答案:

答案 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传递'$$'。由于truefalse对解析器不重要,因此它们可以在变量中,并且事情仍然有效。

当然,如果你想让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。