我试图了解
(ba)sh
如何“在幕后”工作。我注意到一个困扰我的问题。大多数参数,例如 @
、?
甚至 *
都可以视为只读变量。它们可以分配给具有完全相同“值”的变量(例如STAR_VAR=$*
)。
@
是不同的,尤其是用作 "$@"
时。它更像是数组(我们称之为 SET
),可以使用特殊的非数组语法进行访问,例如"$@"
而不是"${SET[@]}"
。您可以了解如何以及何时使用它,但仍然是访问“编号”参数的相当混乱的方式(它更像数组,但您使用非数组语法进行访问)。
Bash
得到了很大的改进,用更“干净”的语法(如 ``
)替换了像 $()
这样的遗留结构。我想知道为什么这个方面没有被清理以使 bash
语法不那么棘手,例如。添加到 shell 或函数的环境数组变量(例如 SET
),其中包含“编号”参数(当然可以选择使用旧语法)?
到底是什么?
"$@"
是一个超级非常特殊的 POSIX(不是 Bash)黑客,它是通过 POSIX shell 规范指定的超级非常特殊的语法来处理的。 https://pubs.opengroup.org/onlinepubs/9699919799/utilities /V3_chap02.html#tag_18_05_02 .
为什么这个方面没有被清理以使 bash 语法不那么棘手
便携性。 Bash 保持了 POSIX 的可移植性,甚至有时会在 POSIX 发生变化时破坏其行为。
(ba)sh 如何“在幕后”工作
Bash 在“底层”的工作方式与指定的方式完全相同。
"$@"
被位置参数的 words 替换,无需对这些单词运行单词拆分和文件名扩展,也无需加入这些单词。源代码在这里https://github.com/bminor/bash/blob/f3b6bd19457e260b65d11f2712ec3da56cef463f/subst.c#L10993和https://github.com/bminor/bash/blob/f3b6bd19457e260b65d11f2712ec3 da56cef463f/subst.c# L10453.