2017-04-25 39 views
1

我想在bashdash做以下命令:建立一个shell命令便携

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

这种失败

-bash:ENV PATH =” /选择/ local/bin目录中:/ opt/local/sbin中:在/ usr/local/bin目录:在/ usr/bin中:/ bin中:/ usr/sbin目录:/ sbin目录中:/ opt/X11/bin中:在/ usr /本地/混帐/ bin:/ usr/local/go/bin:/ dir with space“:无此文件或目录

注意以下几项工作:

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

我分配给变量xENV究其原因,是因为它是一个更大的命令包到$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 
+0

你尝试逃避的空间? – MikeVelazco

+0

看一个更简单的例子:'x =“echo hello”; “$ x”' - 这会返回'echo hello:command not found' - 尝试在没有“$ x”引号的情况下运行它。 –

+0

鉴于您在下面的评论中提到了一个子流程:您真的在使用_shell_代码构建命令行字符串吗?如果在Python中构造字符串,则需要考虑不同的注意事项 – mklement0

回答

1

您可以使用shell阵列来存储和再利用:

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

这是最干净的解决方案 - 使用shell数组。 –

+0

这是一个很好的解决方案。我必须添加一个警告,我在一个不支持bash数组或{}的环境中使用它。 –

+0

但你标记为'bash'。那是什么外壳? – anubhava

0

anubhava's helpful array-based bash answer是最好的选择,如果你可以假设bash(这似乎是最初的情况)。

鉴于您还必须支持dash,它几乎只支持POSIX sh功能,所以不能使用数组。

假设你完全控制或相信你用它来建立一个字符串您的命令行的值,你可以使用eval,其中should generally be avoided

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"