$ [ $(echo) = $(echo) ]
$ echo $?
0
$ [ $(echo) != $(echo) ]
$ echo $?
0
Действительно ли это - ошибка?
P.S. Я заметил это при попытке протестировать, если строка была пуста; кажется, что я могу использовать test -z
с этой целью, но все еще любопытно на предмет этого.
Это не ошибка.
Вы не заключили замену команды в кавычки, таким образом, она не была расширена ни во что (вместо того, чтобы остаться пустой строкой). Тесты работали, на самом деле:
[ = ]
[ != ]
С отдельным аргументом, [ ]
тесты, не является ли аргументом пустая строка и действительно ни один =
ни !=
пустые строки.
(если Вам не нужны эффекты неупомянутого расширения, которое Вы, вероятно, не будете),
[ "$(echo)" = "" ] # $? = 0
[ "$(echo)" != "" ] # $? = 1
Когда Вы делаете [ $(echo) != $(echo) ]
без заключения в кавычки это эквивалентно [ != ]
Теперь, man bash
говорит под SHELL BUILTIN COMMANDS
то, что поведение [ ... ]
тест зависит от количества аргументов следующим образом:
0 arguments The expression is false. 1 argument The expression is true if and only if the argument is not null.
Таким образом, начиная со строки !=
не является пустым, тест TRUE
.
При заключении в кавычки аргументов Вы получите ожидаемое поведение:
$ [ "$(echo)" != "$(echo)" ]
$ echo $?
1
$ [ "$(echo)" = "$(echo)" ]
$ echo $?
0
потому что Вы теперь даете ему 3 аргумента:
3 arguments The following conditions are applied in the order listed. If the second argument is one of the binary conditional operators listed above under CONDITIONAL EXPRESSIONS, the result of the expression is the result of the binary test using the first and third arguments as operands. The -a and -o operators are considered binary operators when there are three arguments. If the first argument is !, the value is the negation of the two-argument test using the second and third arguments. If the first argument is exactly ( and the third argument is exactly ), the result is the one-argument test of the second argument. Other‐ wise, the expression is false.