параметр tar exclude с одинарной кавычкой в ​​ksh - PullRequest
0 голосов
/ 13 августа 2011

У меня проблема со следующим скриптом ksh:

#! /usr/bin/ksh 

EXCLUDE+=" --exclude '/bin/a*' "
echo $EXCLUDE
tar --preserve-permissions --create  $EXCLUDE --file tar.tar /bin

Поскольку для передачи шаблона в исключаемую цель требуются одинарные кавычки. (Я хочу исключить все файлы в папке / bin, начинающиеся с "a").

Строка Echo также показывает правильный и неизменный результат (шаблон не расширился, а одиночная кавычка все еще там). Однако эта исключаемая цель не имеет никакого эффекта.

Но если вместо $ EXCLUDE я подставлю фактическое значение, оно сработает!

#! /usr/bin/ksh 

tar --preserve-permissions --create  --exclude '/bin/a*' --file tar.tar /bin

Должно быть, это какая-то проблема с цитированием, с которой я сталкиваюсь, но что?

Ответы [ 2 ]

1 голос
/ 13 августа 2011

EXCLUDE=' --exclude /bin/a* ' достаточно.Ваш код исключает шаблон '/bin/a*' (кавычки '' являются частью шаблона), но в действительности вы хотите исключить шаблон /bin/a*.

0 голосов
/ 13 августа 2011

Резюме

Да, ваша проблема связана с цитированием.

Обсуждение

При отладке такого рода проблем я обнаружил, что вариант 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+
$
...