【问题标题】:What does two at (@) signs surrounding a string mean in a shell script?在 shell 脚本中,字符串周围的两个 (@) 符号是什么意思?
【发布时间】:2023-01-27 16:18:51
【问题描述】:

例如,

# Execute the pre-hook.
export SHELL=@shell@
param1=@param1@
param2=@param2@
param3=@param3@
param4=@param4@
param5=@param5@
if test -n "@preHook@"; then
    . @preHook@
fi

对于上下文,这是 a commit from 2004 in the Nixpkgs repo 中的 from a shell script;试图查看这是否可能是参考功能,但字符串“" 在整个文件中只出现一次(在区分大小写的搜索中)。

【问题讨论】:

  • 评论移至答案,感谢您的鼓励。
  • @CharlesDuffy 感谢您花时间提供这些细节!
  • 顺便说一句,还有一些其他的@foo@ 示例根本不与 shell 相关;如果我没记错的话(可能不记得了,已经很多年了),那是 CVS 用来将上次更改时间戳和修订号之类的东西替换到需要它们的源文件中的相同形式,f/e。
  • (查了一下,我错了;那是$foo$

标签: shell nixpkgs


【解决方案1】:

answer by Chris Dodd 是正确的,因为 shell 没有内在含义——因此 @foo@ 通常用作印记。就您在 nixpkgs 中遇到的情况而言,它提供了一些专门用于实现此模式的 stdenv 工具。

https://nixos.org/manual/nixpkgs/stable/#ssec-stdenv-functions 所述,nixpkgs stdenv 提供的 shell 函数包括substitutesubstituteAllsubstituteInPlace &c。这将用相应变量的内容替换 @foo@ 值。


在链接提交的上下文中,可以看到在 pkgs/build-wrapper/gcc-wrapper/builder.sh 中执行了该形式的替换:

    sed 
        -e "s^@gcc@^$src^g" 
        -e "s^@out@^$out^g" 
        -e "s^@bash@^$SHELL^g" 
        -e "s^@shell@^$shell^g" 
        < $gccWrapper > $dst

...用$out的值替换@out@,用$SHELL的值替换@bash@,等等。

【讨论】:

【解决方案2】:

@ 符号对 shell 没有任何意义——它是一个标点符号,几乎不会出现在任何实际的 shell 脚本中。

这使得在脚本模板中使用模式是一个不错的选择——基本思想是将使用一个简单的搜索和替换过程(可能使用您显示的链接中的 sed 脚本)将模板重写为实际的 shell 脚本。 @ 形式的每个字符串名称模板中的@ 将替换为与安装脚本的环境相关的其他一些字符串。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-28
    • 2013-12-03
    • 2016-04-15
    • 2011-06-10
    • 1970-01-01
    • 2012-04-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多