3p1*_*uc3 5 bash shell-script portability
我知道 Bash 有分词,但 zsh 没有,我不熟悉其他人(csh、tcsh、ksh 等),但我想知道它是否属于任何标准的一部分。
换句话说,是否sh
有分词,或者它是 Bash-only 功能?如果我想编写一个可移植的 shell 脚本,我是否必须考虑分词,还是其他 shell 添加的非标准内容?
隐式分词,即在不带引号的变量扩展($foo
与 相对"$foo"
)上进行分词,是所有符合 POSIX 的 shell 所做的事情,更普遍的是所有sh
shell。他们还对结果进行通配。这就是为什么在变量替换周围需要双引号的原因。命令替换也是如此。
Zsh 偏离了标准的 sh 行为。它不会对未加引号的变量替换执行分词(但它确实对未加引号的命令替换执行分词),并且它根本不会对未加引号的替换执行通配符。(当然,Zsh 具有这些功能,但它们是明确的:$=foo
进行分词和$~foo
进行通配符。) Zsh 不是与 sh 兼容的外壳;它相当接近,但不兼容,减少的隐式分裂是主要偏差之一。
Zsh 有一个兼容模式(如果 zsh 可执行文件被调用sh
或自动进入ksh
),它确实像 sh 一样执行隐式分词和通配符等。
Bash 和 ksh 都是 sh 兼容的 shell。Bash 确实与 POSIX 存在一些不兼容,但您必须深入挖掘才能找到它们。在隐式拆分等重要问题上,它是兼容的。
(T)csh 是一个完全不同的 shell 家族。它的语法与 sh 有很大不同。它也几乎死了,所以不用担心。