详细来说,情况是这样的。
我正在尝试准备模块文件(即 environment-modules 包使用的类型)来设置第三方软件的环境和别名。某些别名尤其让我头疼。作者提供的 shell 资源文件(我希望摆脱这些文件,转而使用与 shell 无关的环境,因此我对模块文件感兴趣)设置了包含文字花括号的别名。当我尝试将相同的字符串放入模块文件中时,花括号的内容会被展开。
在 csh/tcsh 中,模块文件的 set-alias 命令似乎被处理并转换为 shell 提供的“alias”命令。然后使用 eval 进行处理,如下所示:
eval `alias foo 'thing to alias foo to';`
(是的,结尾的分号是命令的一部分)。
我无法摆脱任何这些元素 - eval,评估字符串周围缺少双引号,或者别名文本周围的单引号 - 而无需编译模块的自定义版本,而我不愿意这样做。
现在,如果别名包含花括号,我看不出如何在 eval 语句的上下文中保护它们,以免它们被解释。我试过从这里到廷巴克图的反斜杠,试过双引号,试过单引号,试过在双引号内使用单引号,试过上述的组合。到目前为止,什么都没起作用,这近乎荒谬。尽管进行了广泛的谷歌搜索,但我还是无法找到任何答案。
有没有办法避开花括号?如果没有,请告诉我,我会继续我的生活;如果有,并且不需要重新编译,我将非常感激任何建议。谢谢!
答案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"