#csh #apostrophe
#csh #апостроф
Вопрос:
Кто-нибудь может объяснить, почему
#!/bin/csh
tar --file=test.a --append --transform 's,^,data/,' data/jobid.dat
работает, как и ожидалось, создавая test.a с данными / data /jobid.dat в нем,
но
#!/bin/csh
set opt="--transform 's,^,data/,'"
echo "$opt"
tar --file=test.a --append "$opt" data/jobid.dat
сбой с
--transform 's,^,data/,'
tar: unrecognized option '--transform 's,^,data/,''
Спасибо и приветствия,
Маттиас
Ответ №1:
Рабочий вариант рассматривается 's,^,data/
как отдельный аргумент для программы tar, отдельно от --transform
аргумента.
Это: set opt="--transform 's,^,data/,'"
устанавливает значение opt в ту же строку.
При выполнении tar … "$opt"
значение opt подставляется в качестве единственного аргумента команды, что приводит к появлению аргумента, который tar
не распознается. Впоследствии команда снова не разбивается на слова — разделение слов происходит перед подстановкой параметров и не выполняется повторно для подстановки, которая происходит в кавычках.
Я считаю (но не проверял), что если вы напишете $foo
без кавычек, вы получите желаемый эффект.
Комментарии:
1. Спасибо, вы дали важный намек: «разделение слов». Таким образом, set opt=(—transform ‘s,^,data/,’), создающий список, помогает. Тогда действительно не нужны кавычки.
2. О, вы знаете, что — я даже не заметил, прежде чем это был вопрос csh. Я ответил так, как если бы это был bash. Рад, что вы это поняли.