3

Чтобы дать более подробную информацию, ситуация такова.

Я пытаюсь подготовить файлы модулей (то есть того типа, который используется в пакете environment-modules) для настройки среды и псевдонимов для стороннего программного обеспечения. Некоторые псевдонимы, в частности, вызывают у меня горе. Файлы ресурсов оболочки, предоставленные автором - которые я надеюсь уйти от среды, не зависящей от оболочки, и, следовательно, мой интерес к файлам модулей - устанавливают псевдонимы, которые включают буквальные фигурные скобки. Когда я пытаюсь поместить ту же строку в файл модуля, содержимое фигурных скобок раскрывается.

Похоже, что в csh/tcsh команда set-alias файла модуля обрабатывается и превращается в команду "alias", предложенную оболочкой. Затем это обрабатывается с помощью eval, как показано ниже:

eval `alias foo 'thing to alias foo to';`

(да, конечная точка с запятой является частью команды).

Я не могу обойтись ни одним из этих элементов - eval, отсутствием двойных кавычек вокруг вычисляемой строки или одинарных кавычек вокруг текста псевдонима - без компиляции пользовательской версии модулей, которую я не хочу делать.

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

Есть ли способ избежать фигурных скобок? Если нет, дайте мне знать, и я продолжу свою жизнь; Если это так, и это не требует перекомпиляции, я очень ценю любой совет. Спасибо!

3 ответа3

1

Мое решение для tcsh/csh немного многословно. Это вставить "{" в отдельную переменную.

  set lc="{"
  set rc="}"

Я делаю то же самое для знака доллара, от которого мне трудно избавиться. Очень полезно для регулярных выражений grep.

Вот мой вырезать / вставить из моего .cshrc:

  set dollar = \$

Результат использования, как я уже сказал, многословен, но по крайней мере работает:

> echo "${dollar}${lc}this is inside curlybraces${rc}"
${this is inside curlybraces}

Обратите внимание, что вам нужны эти дополнительные кавычки.

Надеюсь это поможет!

1

Другое решение:

set-alias foo {env LD_LIBRARY_PATH=`printf "\044\173LD_LIBRARY_PATH\175"`:/some/path command-to-run}

044, 173 и 175 являются восьмеричным кодом для символов ascii $, {, и}

0

Используйте 2 одинарные кавычки для защиты (экранирования) фигурных скобок. Вам может понадобиться одна двойная кавычка ("), когда вы выводите переменную:

set a=''{''
echo "$a"

Кроме того, эхо в обратных кавычках () может использоваться с экранированными скобками:

set b = " COMMANDS `echo ''{''` MORE COMMANDS `echo ''}''` "  
echo "$b"

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .