概括
是的,您的问题与引用有关。
讨论
在调试这类问题时,我发现echo
每行打印一个参数的变体是非常宝贵的。我为它使用的名称是al
(用于“参数列表”)。将其用作tar
脚本中命令的前缀,使用 ' ksh -x tartest.ksh
' 运行,跟踪输出为:
+ EXCLUDE+=$' --exclude \'/bin/a*\' '
+ echo --exclude $'\'/bin/a*\''
--exclude '/bin/a*'
+ al tar --preserve-permissions --create --exclude $'\'/bin/a*\'' --file tar.tar /bin
tar
--preserve-permissions
--create
--exclude
'/bin/a*'
--file
tar.tar
/bin
请注意 shell 是如何花费大量时间来确保tar
命令(或al
命令)看到单引号的。当您遵循John的建议时,您会看到不同的输出:
+ EXCLUDE+=' --exclude /bin/a* '
+ echo --exclude '/bin/a*'
--exclude /bin/a*
+ al tar --preserve-permissions --create --exclude '/bin/a*' --file tar.tar /bin
tar
--preserve-permissions
--create
--exclude
/bin/a*
--file
tar.tar
/bin
请注意,这一次,tar
( al
) 准确地看到/bin/a*
而不是'/bin/a*'
。
al
您可以在 C 或 shell 中简单地编写:
for arg; do echo "$arg"; done
#include <stdio.h>
int main(int argc, char **argv)
{
while (*++argv != 0)
puts(*argv);
return 0;
}
在 MacOS X 10.7 上执行的测试/bin/ksh
,其标识为:
$ ksh --version
version sh (AT&T Research) 1993-12-28 s+
$