0

例如,

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

对于上下文,这是来自Nixpkgs repo 中 2004 年提交中shell 脚本;试图查看这是否可能是一个参考功能,但字符串“ shell ”在整个文件中只出现一次(在区分大小写的搜索中)。

4

2 回答 2

2

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

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

于 2021-05-01T18:13:43.687 回答
2

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

https://nixos.org/manual/nixpkgs/stable/#ssec-stdenv-functions中所述,nixpkgs stdenv 提供了 shell 函数,包括substitute, substituteAll, substituteInPlace&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@bash@用 的值$SHELL等替换。

于 2021-05-01T18:35:23.443 回答