我有一个调用另一个 Bash 脚本的 Bash 脚本。被调用的脚本会做一些修改和检查一些事情,转移,然后传递调用者命令行的其余部分。
在被调用的脚本中,我已验证我已管理好所有内容并准备好调用。这是我输入的一些调试风格的代码:
echo $SVN $command $@ > /tmp/shimcmd
bash /tmp/shimcmd
$SVN $command $@
现在,在 /tmp/shimcmd 你会看到:
svn commit --username=myuser --password=mypass --non-interactive --trust-server-cert -m "Auto Update autocommit Wed Apr 11 17:33:37 CDT 2012"
也就是说,构建的命令都在一行上,非常好,包括 -m "my string with spaces" 部分。
这是完美的。它的“bash /tmp/shimcmd”执行也很完美。
但我当然不想要这个愚蠢的 tmp 文件之类的(只用它来调试)。问题是直接调用命令,而不是通过 shim 文件:
$SVN $command $@
导致 svn 命令本身不接收带空格的引号字符串——它使“-m “我的带空格的字符串”参数乱码,并把命令当作“-m 我的带空格的字符串”传递。
我尝试了各种疯狂的逃生方法,但都无济于事。不敢相信它这么严重地缠着我。同样,通过将相同的内容 ($SVN $command $@) 回显到文件然后执行该文件,就可以了。但是直接调用会使引用的字符串出现乱码。仅此元素即可。
有任何想法吗?
担