在字符串中构建一个shell命令,以便以后可以移植

时间:2017-04-25 21:38:14

标签: shell

我正在尝试在bashdash中执行以下命令:

x="env PATH=\"$PATH:/dir with space\""
cmd="ls"
"$x" $cmd

失败
  

-bash:env PATH =“/ opt / local / bin:/ opt / local / sbin:/ usr / local / bin:/ usr / bin:/ bin:/ usr / sbin:/ sbin:/ opt / X11 / bin中:在/ usr /本地/ git的/ bin中:在/ usr /本地/去/斌:/ DIR   空格“:没有这样的文件或目录

请注意以下工作:

env PATH="$PATH:/dir with space" $cmd

我分配给变量x env 的原因是因为它是$cmd的更大命令包装器的一部分,这也是一个复杂的变量。

它比最初的例子更复杂。我有设置这些变量的逻辑,而不是每次重复它们。最终调用如下所示:

path_value="$PATH"
invocation="env PATH=\"$path_value\" $other_val1 $other_val2"
base="python python_script.py --opt1=a,b,c script_args"
add_on="$base more_arg1 more_arg2"
"$invocation" $base

2 个答案:

答案 0 :(得分:1)

您可以使用shell数组来存储和重用:

x=(env PATH="$PATH:/dir with space")
cmd="ls"
"${x[@]}" "$cmd"

答案 1 :(得分:0)

anubhava's helpful array-based bash answer是最佳选择,如果您只能 bash(最初似乎是这种情况)。

鉴于您还必须支持dash,它几​​乎完全支持POSIX sh功能,但数组不是一个选项。

假设您完全控制或信任用于在字符串中构建命令行的值,则可以使用eval path_value="$PATH" invocation="env PATH=\"$path_value\" $other_val1 $other_val2" base="python python_script.py --opt1=a,b,c script_args" add_on="$base more_arg1 more_arg2" eval "$invocation $add_on"

S3