Как в csh/tcsh включить фигурные скобки в команду, обрабатываемую с помощью eval?

Как в csh/tcsh включить фигурные скобки в команду, обрабатываемую с помощью eval?

Если говорить более подробно, то ситуация такова.

Я пытаюсь подготовить 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"

Связанный контент