我有以下代码:
set -o xtrace
openDirectory ()
{
lxterminal --command="zsh -c 'cd "$1"; zsh -i' "
}
# Handle argument.
if [ "$@" ]
then
openDirectory ~/Projects/Clients/"@1"
cd $1
fi
如果传递的参数中有空格,这将失败。
lxterminal '--command=zsh -c '\''cd /home/chris/Projects/Clients/Test' - 'Space; zsh -i'\'' '
cd Test - Space
cd: too many arguments
我怎样才能正确地逃避这个?这甚至可以用bash之类的东西来完成吗?
假设封闭的外壳确实是 bash (因为问题被标记),您可以使用printf -v varname %q "$var"
将值的安全引用实例存储var
到名为 的变量中varname
,如下所示:
openDirectory()
{
local cd_cmd cmd
printf -v cd_cmd '%q ' cd "$1"
printf -v cmd '%q ' zsh -c "$cd_cmd && zsh -i"
lxterminal --command="$cmd"
}
printf '%q'
计算为给定字符串的一个版本,当eval
被 bash(或任何具有等效语义的 shell) 'ed时,将计算为原始文字值。
要解释为什么这样做:
printf %q
对所有报价和逃逸。这是最佳实践方法:使用文字引号意味着正在生成的数据中的文字能够转义这些引号。&&
通过 shell 引用)将使它们成为文字数据。因此,当我们将它作为参数传递给 时,我们希望它&&
是文字数据而不是语法-c
,而不是由远程shell 处理时的文字数据——这就是为什么它只出现在最后一次引用传递中。本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句