在 shell 脚本中,字符串周围的两个 (@) 符号是什么意思?

What does two at (@) signs surrounding a string mean in a shell script?

例如,

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

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

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

这使得在脚本模板中使用模式成为一个不错的选择——基本的想法是将使用一个简单的搜索和替换过程(可能与 link 中的 sed 脚本一起使用你展示)将模板重写为实际的 shell 脚本。模板中 @name@ 形式的每个字符串都将替换为与脚本安装环境相关的其他字符串。

是正确的,因为 shell 没有内在含义 - 因此 @foo@ 通常用作印记。只要您在 nixpkgs 中遇到过这个问题,它就提供了一些专门用于实现此模式的 stdenv 工具。

https://nixos.org/manual/nixpkgs/stable/#ssec-stdenv-functions 中所述,nixpkgs stdenv 提供 shell 函数,包括 substitutesubstituteAllsubstituteInPlace 等。这将用相应变量的内容替换 @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@,等等