Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
控件运算符作为bash脚本中的可选参数_Bash_Shell - Fatal编程技术网

控件运算符作为bash脚本中的可选参数

控件运算符作为bash脚本中的可选参数,bash,shell,Bash,Shell,我正在尝试在后台随意运行一个程序。是否有一种方法可以选择性地通过控制操作员。比如: if some_condition bg=& fi myprog $bg 然而,正如我所看到的,bash(正确地)将$bg视为myprog的参数。我正在尝试让myprog在后台运行 有办法做到这一点吗?怎么样: if some_condition then myprog & else myprog fi 我赞成James Brown的答案,但是,如果您只想指定一次mypro

我正在尝试在后台随意运行一个程序。是否有一种方法可以选择性地通过控制操作员。比如:

if some_condition
    bg=&
fi

myprog $bg
然而,正如我所看到的,bash(正确地)将
$bg
视为
myprog
的参数。我正在尝试让
myprog
在后台运行

有办法做到这一点吗?

怎么样:

if some_condition
then 
  myprog &
else
  myprog
fi

我赞成James Brown的答案,但是,如果您只想指定一次
myprog
,那么您可以使用函数来确定它是否应该在后台运行。然而,这确实意味着你一开始会写更多的行,但是如果你在后台大量运行,你可能会从中受益

run_in_background=false

run_cmd () {
    echo "Running $@"
    if $run_in_background; then
        "$@" &
    else
        "$@"
    fi
}

if [[ "$1" == '--bg' ]]; then
    run_in_background=true
    shift
fi

run_cmd "$@"
然后您可以这样运行它:

./script.bash --bg sleep 1
或者,如果可以在脚本本身中运行它:

... (Continuing from inside the script above)
run_cmd sleep 1
run_cmd echo hello
wait  # Waits for background processes to finish

然后,您可以通过省略或使用
--bg
标志来确定传递给
run_cmd
的命令是在前台还是在后台。

eval myprog$bg
?为什么不“如果某个条件;那么myprog&;fi”?否则,您可以使用eval。我本来打算建议
eval
,但是
eval
evil
。如果语句,使用和
将更容易、更安全。@Robertseam你能详细说明一下
eval是邪恶的吗?@ArunPrakashJana当使用
eval
时,你必须非常小心,因为你可以运行不需要的命令(特别是在处理用户输入时)。尽可能避免使用
eval
,只在需要时使用。我已经在这样做了。然而,我想知道是否有一种方法可以在一行中处理这个问题,而无需条件检查。如果您的目的是只指定
myprog
一次,那么我在下面添加了一个解决方案,但是,如果您只运行
myprog
一次,那么James的答案会更好。