“可变”& 符号(后台进程)

“可变”& 符号(后台进程)

我想知道是否有一种方法可以将&符号放入变量中并仍然使用它来将进程发送到后台。

这有效:

BCKGRND=yes
if [ "$BCKGRND" = "yes" ]; then
    sleep 5 &
else
    sleep 5
fi

但仅用一行来完成这五行不是很酷吗?就像这样:

BCKGRND='&'
sleep 5 ${BCKGRND}

但这是行不通的。如果 BCKGRND 未设置,则它可以工作 - 但当设置它时,它会将其解释为文字“&”并出错。

答案1

不可能使用变量来后台调用,因为在解析命令行以获取控制运算符(例如&&&)之后会发生变量扩展。

另一种选择是将调用包装在函数中:

mayberunbg() {
  if [ "$BCKGRND" = "yes" ]; then
    "$@" &
  else
    "$@"
  fi
}

...然后根据需要设置变量:

$ BCKGRND=yes mayberunbg sleep 3
[1] 14137
$
[1]+  Done                    "$@"
# or
$ BCKGRND=yes
$ mayberunbg sleep 3
[1] 14203
$
[1]+  Done                    "$@"
$ BCKGRND=no mayberunbg sleep 3
# 3 seconds later
$

答案2

你可以翻转事物并改变“前景”:

FOREGROUND=fg
sleep 5 & ${FOREGROUND}

设置FOREGROUNDtrue或空以在后台运行该进程。 (设置FOREGROUNDtrue在后台运行确实令人困惑!适当的变量名称留给读者作为练习。)

答案3

您可能必须使用eval

eval "sleep 5" "$BCKGRND"

eval导致 shell 重新评估给定的参数。因此,文字&将被解释为&位于命令末尾,而不是作为命令的参数,从而将命令置于后台。

相关内容