Неясная обработка апострофа csh

#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. Рад, что вы это поняли.