在 csh/tcsh 中,如何将文字花括号合并到用 eval 处理的命令中?

在 csh/tcsh 中,如何将文字花括号合并到用 eval 处理的命令中?

详细来说,情况是这样的。

我正在尝试准备模块文件(即 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"

相关内容