在 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 函数,包括 substitute
、substituteAll
、substituteInPlace
等。这将用相应变量的内容替换 @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@
,等等
例如,
# 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@
形式的每个字符串都将替换为与脚本安装环境相关的其他字符串。
@foo@
通常用作印记。只要您在 nixpkgs 中遇到过这个问题,它就提供了一些专门用于实现此模式的 stdenv 工具。
如 https://nixos.org/manual/nixpkgs/stable/#ssec-stdenv-functions 中所述,nixpkgs stdenv 提供 shell 函数,包括 substitute
、substituteAll
、substituteInPlace
等。这将用相应变量的内容替换 @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@
,等等