Shell脚本中被双@包裹的字符串有什么含义?结合Nixpkgs实例
双@包裹的字符串不属于Shell原生语法
这类被两个@包裹的字符串是模板占位符,是Nixpkgs构建流程自定义的前置处理标记,和Shell本身的解释执行逻辑没有任何关系。
实际的处理流程
- 你当前看到的带
@shell@、@param1@、@preHook@标记的文件,是存在代码仓库里的模板源文件,根本不是可以直接交给Shell执行的最终脚本。 - 在Nix的构建流程中,会有专门的预处理环节对这份模板做全文替换:所有被
@xxx@格式包裹的标记,都会被替换成构建阶段传入的实际配置值。- 比如模板里写的
export SHELL=@shell@,经过替换后最终生成的可执行脚本里,这行代码会变成类似export SHELL=/nix/store/xxxxx-bash-xxx/bin/bash的真实有效路径; - 模板里的
@preHook@占位符,最终会被替换成对应预执行钩子脚本的实际存储路径。等所有占位符都替换完成后,最终交付给Shell执行的脚本里不会残留任何未替换的@标记。
- 比如模板里写的
为什么全文搜索不到对应变量的定义
你在整份模板文件里找不到重复出现的shell同名变量定义,本质是因为这些占位符根本不是Shell层面的变量——它们只是给外部替换程序看的标记,不需要在脚本内部做任何声明或引用。
这种@占位符@的写法是Nix生态沿用了二十多年的惯例,因为@符号和Shell原生语法使用的$、反引号等标记完全不冲突,做文本替换时不会误改脚本本身的正常代码,因此一直被保留了下来。
内容的提问来源于stack exchange,提问作者toraritte
相关产品推荐
相关产品推荐

