[команда возвращает нулевое состояние выхода, если выражение, содержащееся в ее аргументах, считается истинным, а ненулевое состояние выхода, если выражение, содержащееся в его аргументах, считается ложным. Он также завершается с сообщением об ошибке, если его последний аргумент не является ](это делается исключительно по эстетическим соображениям).
Например:
[ 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/testenable -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