Проблема построения командной строки в tcsh для выполнения (по lsf), проблемы с переменными и кавычками - PullRequest
0 голосов
/ 21 ноября 2018

Я использую tcsh (требуется контракт, не могу перейти на bash и т. Д.), Но у меня проблема с созданием команды на основе различных условий для разных частей.

Некоторые имена изменены для защиты невинных ...

Если имя новой или старой программы действительно выбрано ранее препроцессором и жестко закодировано к моменту запуска этого сценария оболочки:

set myCMDline = newProgName
set myCMDlineTmpFile = "/tmp/myCMDlineTmpScriptFile.csh"
set bsubQname = "typical"

set bsubResources = "span[hosts=1]"
set myCMDline  = "bsub -q $bsubQname -n 8 -R \"$bsubResources\" $myCMDline"

($myCMDline)

Теперь я попробовал нескольковарианты выше, все не работает по той или иной причине.Самое близкое, что я думаю, - это жалоба на несовпадающие двойные кавычки, даже когда они возвращаются назад.

Когда я выполняю эхо-запрос $ myCMDline, тогда это выглядит нормально, но выполнение же должно как-то отличаться...

set bsubResources = '"span[hosts=1]"'    #double-quotes inside, single-quotes outside
set myCMDline  = "bsub -q $bsubQname -n 8 -R $bsubResources $myCMDline"

.

set bsubResources = "span[hosts=1]"    #double-quotes inside, single-quotes outside
set myCMDline  = 'bsub -q $bsubQname -n 8 -R "$bsubResources" $myCMDline'

.

set bsubResources = "span[hosts=1]"    #double-quotes inside, single-quotes outside
set myCMDline  = "bsub -q $bsubQname -n 8 -R '$bsubResources' $myCMDline"

и т. Д.

Я также попытался создать дамп в отдельный файл временного сценария.к исходному тексту, но содержит имена переменных $, а не разрешенные эквиваленты, как я бы предпочел, поскольку я делаю set, а не setenv, и предпочитаю не помещать их в переменные оболочки.

Сначала я не смог повторитьСтрока "#! / bin / csh -f", кажется, пытается выполнить это, а не эхо, перенаправленное в файл временного сценария, и умирает.

rm -f $myCMDlineTmpFile
echo "#!/bin/csh -f  > $myCMDlineTmpFile
echo "$myCMDline" >> $myCMDlineTmpFile
($myCMDlineTmpFile)

Затем я попробовал многострочное эхо, котороеВот где я вижу, что локальные имена переменных входят в файл, а не в их содержимое:

/bin/cat > $myCMDlineTmpFile <<EOF
#!/bin/csh -f
$myCMDline

EOF

source $myCMDlineTmpFile

И затем я пытаюсь вместо этого использовать eval:

eval `echo "$myCMDline &" `

с и безгалочки и т. д., но жалуется на неизвестные переменные для очереди name, ресурсы и т. д.

Добавление этого эха всегда выглядит так, как я хочу видеть в командной строке, между >>> и <<< </p>

echo "DEBUG - myCMDline= >>>$myCMDline<<<"

Пожалуйста, помогите мне решить эту загадку...

1 Ответ

0 голосов
/ 25 марта 2019
set myCMDline  = "bsub -q $bsubQname -n 8 -R \"$bsubResources\" $myCMDline"

($myCMDline)

Это не сработает, потому что csh рассматривает это как одну строку, поэтому обрабатывает всю строку как одно большое имя программы.Вместо этого вы должны определить массив:

set myCMDline  = (bsub -q $bsubQname -n 8 -R "$bsubResources" $myCMDline:gaq)
($myCMDline:gaq)

Объяснение: :gaq - это подстановка, заключающая в кавычки все строки в списке и сохраняющая каждый элемент списка без изменений.Это очень похоже на "$ @" в bash.

Это задокументировано в Подстановка истории

g Применитьследующий модификатор один раз для каждого слова.

a (+) Примените следующий модификатор столько раз, сколько возможно к одному слову.`a 'и` g' могут использоваться вместе, чтобы применять модификатор глобально.В текущей реализации совместное использование модификаторов `a 'и` s' может привести к бесконечному циклу.Например, `: as / f / ff / 'никогда не завершится.Это поведение может измениться в будущем.

q Цитировать замещенные слова, предотвращая дальнейшие замены.

Это относится к тексту в подстановка переменных :

Модификаторы `: ', описанные в Подстановка истории , за исключением`: p', могут применяться к вышеупомянутым подстановкам.Можно использовать более одного.(+) Могут понадобиться фигурные скобки, чтобы изолировать переменную подстановку от буквального двоеточия так же, как с Подстановка истории (qv);любые модификаторы должны появляться в фигурных скобках.

...