2015-11-12 4 views
1

Я пишу csh сценарий, и мне нужно выполнить команду, из командной строки будет:установить CSH команды с параметрами в пределах «»

$ повелевать -c «: переменная = а + Ь»

Так что я стараюсь:

набор CMD = "Команда -c " ' ": переменная = а + Ь"'" -o выходной_файл"
эхо $ CMD
$ cmd

Строка cmd показана правильно с эхом. Но когда я пытаюсь выполнить $cmd, я получаю сообщение об ошибке, указывающее, что аргумент -c не распознается. Сообщения об ошибках: = а + Ь»

Т.е: вар часть отсутствует

Любой совет

+0

не использовать 'csh'? Шутки в сторону! , Такая проблема сложна на любом языке оболочки, и все это связано с тем, что можно правильно управлять цитированием. Есть места в csh, цитирующие, что «просто не работают так, как должны», и то, что вы пытаетесь сделать правильно, - это самые большие слабые места csh. Есть много других причин, чтобы не создавать скрипты в csh, искать в Интернете для 'csh считаются вредоносными' и' csh whynot'. Если вы должны продолжить, найдите старую книгу инструментов O'Reilly Unix Power Tools и прочитайте весь материал о csh. Наконец, используйте shebang как '#!/Bin/csh -fvx' ...' vx', дающий вам отладочную/трассировку. GoodL – shellter

+0

Несколько других комментариев. Также забыл подключить действительно лучшую книгу о 'csh' http://www.amazon.com/The-Unix-Shell-Field-Guide/dp/013937468X. Самый симпатичный онлайн-ресурс для csh, о котором я знаю, - http://www.grymoire.com/Unix/Csh.html (Начать там). Если вы должны упорствовать, и вы не знаете о 'eval' cmd, то это может вам помочь, но это займет некоторое время, чтобы понять И это обычно считается икрой сатаны, поэтому будьте готовы к этому, когда вы публикуете Q с 'eval'. Наконец, если вам действительно нужна эта функциональность, вы найдете ее намного более расширяемой в ksh или bash – shellter

ответ

0

Я пойду один шаг дальше, чем @shellter, и сказать это.? не может быть сделано в CSH или TCSH.

CSH синтаксический анализ очень упрощен и либо расширяет переменные, либо нет. И если он это делает, он не выполняет чеки кавычек, которые он находит в этих переменных. Другими словами, синтаксический анализатор не является рекурсивным.

Таким образом, вы не можете даже сделать это:

args="-c 'with space'" 
command $args 
command "$args" 

Первая версия будет проходить -c, with и space к команде, второй вариант будет проходить -c with space.