Почему ] вместо ]?

В этом ответе у меня был код, который читал:

if [[ $ZSH_VERSION ]]; then 

Это было отредактировано, чтобы быть:

 if [[ -n $ZSH_VERSION ]]; then 

Обновление: я только что видел комментарий редактирования:

[[x]] до недавнего времени не работал в zsh

Я просмотрел заметки о выпуске zsh и не смог найти ссылку на это.

Какая версия zsh впервые разрешена [[ x ]] ?

2 Solutions collect form web for “Почему ] вместо ]?”

Из zsh 5.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... 

Проверка журнала git log показывает, что изменение кода произошло немного раньше, чем документация:

 commit 9d47e8398d299e53ffe4e7ddf3731d2fedae9948 ... Date: Tue May 13 08:16:50 2014 -0700 32609: [[ $var ]] behaves as [[ -n $var ]] for bash/ksh compatibility 

Сопоставление файла ChangeLog с git tag мне не совсем понятно, но, похоже, zsh 5.0.6 (четверг, 28 августа 19:07:04 2014 +0100) – первая версия с этим изменением.

Это более явно показывает, что делает код.

Лично в этом случае я бы немного предпочел [[ -n $ZSH_VERSION ]] потому что это показывает, что он проверяет непустоту значения переменной var.

Но у меня часто есть переменные, предназначенные для логического значения в моих сценариях, и я is_logged_in их соответственно, как is_logged_in или running_in_background . Если такие переменные не заданы в моих сценариях, они false . И в таких случаях я предпочитаю использовать [[ running_in_background ]] только потому, что это читается лучше без части -n , как обычное предложение:

 if [[ running_in_background ]] ; then echo "something" | logger -t myprog fi 

Но IMO это просто вопрос вкуса, и поэтому его не следовало редактировать: это ваш код.

Linux и Unix - лучшая ОС в мире.