Если говорить более подробно, то ситуация такова.
Я пытаюсь подготовить modulefiles (т. е. того типа, который используется пакетом environment-modules) для настройки окружения и псевдонимов для стороннего программного обеспечения. Некоторые псевдонимы, в частности, доставляют мне неприятности. Файлы ресурсов оболочки, предоставленные автором, — от которых я надеюсь уйти и приблизиться к среде, не зависящей от оболочки, отсюда мой интерес к modulefiles — устанавливают псевдонимы, включающие буквальные фигурные скобки. Когда я пытаюсь поместить ту же строку в modulefile, содержимое фигурных скобок расширяется.
Похоже, что в csh/tcsh команда set-alias modulefile обрабатывается и преобразуется в команду "alias", предлагаемую оболочкой. Затем она обрабатывается с помощью eval следующим образом:
eval `alias foo 'thing to alias foo to';`
(да, конечная точка с запятой является частью команды).
Я не могу обойтись без этих элементов — eval, отсутствия двойных кавычек вокруг оцениваемой строки или одинарных кавычек вокруг текста псевдонима — без компиляции пользовательской версии модулей, чего мне делать не хочется.
Теперь, если псевдоним содержит фигурные скобки, я не вижу, как в контексте оператора eval защитить их, чтобы они не интерпретировались. Я пробовал обратные косые черты отсюда до Тимбукту, я пробовал двойные кавычки, я пробовал одинарные кавычки, я пробовал одинарные кавычки внутри двойных кавычек, я пробовал комбинации вышеперечисленного. Пока ничего не сработало, и это граничит с абсурдом. Несмотря на обширные поиски в Google, я не смог найти никаких ответов.
Есть ли способ обойти фигурные скобки? Если нет, дайте мне знать, и я продолжу жить своей жизнью; если да, и это не потребует перекомпиляции, я буду очень признателен за любой совет. Спасибо!
решение1
Мое решение для tcsh/csh немного многословно. Оно заключается в том, чтобы вставить "{" в отдельную переменную.
set lc="{"
set rc="}"
Я делаю то же самое для знака доллара, который мне сложно экранировать. Очень полезно для регулярных выражений grep.
Вот мой код из .cshrc:
set dollar = \$
Результат использования, как я уже сказал, многословен, но, по крайней мере, работает:
> echo "${dollar}${lc}this is inside curlybraces${rc}"
${this is inside curlybraces}
Обратите внимание, что вам нужны дополнительные кавычки.
Надеюсь это поможет!
решение2
Другое решение:
set-alias foo {env LD_LIBRARY_PATH=`printf "\044\173LD_LIBRARY_PATH\175"`:/some/path command-to-run}
044, 173 и 175 — это восьмеричные коды символов ASCII $, { и }.
решение3
Использовать2 одинарные кавычкидля защиты (экранирования) фигурных скобок. Вам может понадобиться одна двойная кавычка ("), когда вы выводите переменную:
set a=''{''
echo "$a"
Кроме того, echo внутри обратных кавычек ( ) можно использовать с экранированными скобками:
set b = " COMMANDS `echo ''{''` MORE COMMANDS `echo ''}''` "
echo "$b"