Резюме
Да, ваша проблема связана с цитированием.
Обсуждение
При отладке такого рода проблем я обнаружил, что вариант 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
Обратите внимание, как оболочка прошла значительные отрезки времени, чтобы команда tar
(или команда al
) видела одинарные кавычки. Когда вы следуете совету Джона , вы видите другой вывод:
+ 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+
$