分词是 POSIX 的一部分吗?

分词是 POSIX 的一部分吗?

我知道 Bash 有分词功能,但 zsh 没有,而且我对其他(csh、tcsh、ksh 等)不熟悉,但我想知道它是否是任何标准的一部分。

换句话说,是否sh有分词功能,还是 Bash 独有的功能?如果我想编写一个可移植的 shell 脚本,我是否必须考虑分词,或者是否是其他 shell 添加的非标准内容?

答案1

隐式分词,即在未加引号的变量扩展上进行分词($foo与 相对"$foo"),是所有 POSIX 兼容 shell(更普遍的是所有shshell)都会执行的操作。他们还对结果进行通配。这就是为什么您需要将变量替换用双引号括起来。命令替换也是如此。

POSIX 称这些为场分裂路径名扩展

Zsh 偏离了标准 sh 行为。它不会对未加引号的变量替换执行单词拆分(但它会在未加引号的命令替换上执行单词拆分),并且它根本不会对未加引号的替换执行通配。 (当然,Zsh 具有这些功能,但它们很明确:$=foo进行分词和$~foo进行通配。)Zsh 不是与 sh 兼容的 shell;它是一个与 sh 兼容的 shell。它相当接近,但不兼容,并且减少的隐式分裂是主要偏差之一。

Zsh 有一个兼容模式(如果调用 zsh 可执行文件,sh则自动进入该ksh模式),在该模式下,它确实像 sh 一样执行隐式分词和通配符等操作。

Bash 和 ksh 都是与 sh 兼容的 shell。 Bash 确实与 POSIX 存在一些不兼容性,但您必须深入挖掘才能找到它们。在隐式分裂等重要问题上,它是兼容的。

(T)csh 是一个完全不同的 shell 系列。它的语法与 sh 有很大不同。它也已经死了,所以不用担心。

答案2

场分裂在 POSIX 标准中:http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_05

在参数扩展(Parameter Expansion)、命令替换(Command Substitution)和算术扩展(Arithmetic Expansion)之后,shell会扫描双引号中未发生的扩展和替换的结果,以进行字段分割,并且可能会产生多个字段。

shell 应将 IFS 的每个字符视为分隔符,并使用分隔符作为字段终止符,将参数扩展、命令替换和算术扩展的结果拆分为字段。

相关内容