Почему [[ -n $var ]] вместо [[ $var ]]?

Вы также можете создать скрипт:

#!/usr/bin/env bash
runuser -l [yourusername] -c 'DISPLAY=:0 notify-send "hey there user"'

Затем запустите его с помощью sudo. Однако, поскольку crontab -e выполняет все команды с пользователем, который его создал, при вызове без sudo:

#!/usr/bin/env bash
DISPLAY=:0 notify-send "hey there user"

По крайней мере, это для меня. Кажется, что все зависит от конфигурации среды.

7
03.09.2018, 19:10
2 ответа

Из документов zsh5.5.1 дляCONDITIONAL EXPRESSIONS

For compatibility, if there is a single argument that is not syntactically significant, typically a variable, the condition is treated as a test for whether the expression expands as a string of non-zero length. In other words, [[ $var ]] is the same as [[ -n $var ]]. It is recommended that the second, explicit, form be used where possible.

С исходным деревом вокруг,

% 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мне непонятно, но кажется zsh5.0.6 (Чт 28 авг 19 :07 :04 2014 +0100 )— первая версия с этим изменением.

10
27.01.2020, 20:17

Более подробно показано, что делает код.

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

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

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

Но ИМО это всего лишь дело вкуса, и как таковое не должно быть отредактировано :это ваш код.

1
27.01.2020, 20:17

Теги

Похожие вопросы