为什么是 [[ -n $var ]] 而不是 [[ $var ]]?

Tom*_*ale 7 zsh

这个答案中,我有一些代码如下:

if [[ $ZSH_VERSION ]]; then
Run Code Online (Sandbox Code Playgroud)

被编辑为:

if [[ -n $ZSH_VERSION ]]; then
Run Code Online (Sandbox Code Playgroud)

更新:我刚看到编辑评论:

[[ x ]] 直到最近才在 zsh 中工作

我查看了zsh发行说明,但找不到对此的参考。

zsh首先允许哪个版本[[ x ]]

thr*_*rig 10

来自zsh5.5.1 文档CONDITIONAL EXPRESSIONS

为了兼容性,如果有一个在语法上不重要的参数,通常是一个变量,则条件被视为测试表达式是否扩展为非零长度的字符串。换句话说,[[ $var ]] 与 [[ -n $var ]] 相同。建议在可能的情况下使用第二种明确的形式。

有了源树,

% grep -rl 'if there is a single argument' .
./Doc/Zsh/cond.yo
% git blame ./Doc/Zsh/cond.yo | grep 'if there is a single argument'
d082827c83 (Jun T             2014-05-18 22:03:35 +0900 198) For compat...
Run Code Online (Sandbox Code Playgroud)

检查git log表明代码更改比文档更早:

commit 9d47e8398d299e53ffe4e7ddf3731d2fedae9948
...
Date:   Tue May 13 08:16:50 2014 -0700

    32609: [[ $var ]] behaves as [[ -n $var ]] for bash/ksh compatibility
Run Code Online (Sandbox Code Playgroud)

我不清楚ChangeLog文件到的映射git tag,但似乎zsh5.0.6(2014 年 8 月 28 日星期四 19:07:04 +0100)是第一个进行此更改的版本。