[
команда возвращает нулевое состояние выхода, если выражение, содержащееся в ее аргументах, считается истинным, а ненулевое состояние выхода, если выражение, содержащееся в его аргументах, считается ложным. Он также завершается с сообщением об ошибке, если его последний аргумент не является ]
(это делается исключительно по эстетическим соображениям).
Например:
[ hello ]
echo "Exit-status of [ hello ] is:" $?
[ abc = abc ]
echo "Exit-status of [ abc = abc ] is:" $?
[ ]
echo "Exit-status of [ ] is:" $?
[ abc = def ]
echo "Exit-status of [ abc = def ] is:" $?
… Выведет:
Состояние выхода [hello] равно: 0 - потому что непустая строка считается истинной
Состояние выхода [abc = abc] равно: 0 - потому что 'abc' действительно совпадает с 'abc'
Состояние выхода [] : 1 - потому что пустая строка считается ложной.
Статус выхода [abc = def]: 1 - потому что 'abc' действительно отличается от 'def'
Однако bash и многие другие оболочки обычно не вызывают /bin/[
(или /usr/bin/[
) в этих случаях, а вместо этого вызывают встроенную команду с точно таким же поведением (исключительно по соображениям производительности). Для вызова /bin/[
(не суррогата встроенной в оболочку) вам необходимо либо явно указать его путь (например /bin/[ hello ]
, вам не нужно]
указывать префикс dirname, хотя, ), либо настроить оболочку, чтобы она не использовала встроенную суррогатную (например, enable -n [
в баш).
PS: Как было сказано в других ответах, [
связано с test
. Но test
, в отличие от этого [
, не требует в ]
качестве последнего аргумента (и вообще не ожидает его; добавление дополнительных ]
к test
аргументам может привести к сбою с сообщением об ошибке или к возвращению неверного результата) . И может решить тот же файл (например , один слинкован , в этом случае поведение утечка, вероятно , реализуется путем анализа в настоящее время называемой команды в / сам коде) или к различным файлам. Для , shell также обычно вызывает встроенный суррогат, если путь явно не указан ( ) или не настроен на это (/bin/test
/bin/[
test
[
test
/bin/test
enable -n test
).
PPS: В отличие от test
и [
, современное if
никогда не бывает настоящим файлом. Он является частью синтаксиса оболочки (например, bash): if commandA; then commandB; fi
(вместо точек с запятой можно использовать символы новой строки), commandB
если он выполняется, если он и только при commandA
выходе, с нулевым статусом. Это идеально соответствует поведению test
или [
, позволяя объединять их как if [ "$a" = foo ]; then …; fi
(или if test "$a" = foo; then …; fi
- просто менее читабельно) . Однако современные сценарии часто используют [[
вместо test
или [
, что (как if
) никогда не является реальным файлом, но всегда является частью синтаксиса оболочки.
PPPS: Что касается man
- никогда не ждите man
статьи по каждой команде в вашей файловой системе. Информация о какой - то (даже «реального», на основе файлов) команды могут отсутствовать информация о некоторых оболочечных встроенных модулей может быть , присутствует не только в статье , посвященной конкретной оболочки (это место , где вы наверняка найдете информацию о test
, [
, if
, [[
). Тем не менее, во многих дистрибутивах есть явные man
статьи для test
и [
. (О --help
, это не распознается test
по очевидной причине: он должен спокойно обрабатывать такие случаи, как a=--help; test "$a"
; в некоторых дистрибутивах [ --help
(без закрытия ]
) по-прежнему показывает помощь, в некоторых - нет).
[
относится кtest
команде, хотя, нетexpr
, так и должно бытьman test