[
команда возвращает нулевой статус выхода, если выражение, содержащееся в его аргументах, считается истинным и ненулевым статусом выхода, если выражение, содержащееся в его аргументах, считается ложным. Он также выдает сообщение об ошибке, если его последний аргумент не ]
(это сделано исключительно из эстетических соображений).
Например:
[ 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:" $?
… выведет:
Exit-status of [ hello ] is: 0 — because non-empty string is considered true Exit-status of [ abc = abc ] is: 0 — because 'abc' really is same as 'abc' Exit-status of [ ] is: 1 — because empty string is considered false Exit-status of [ abc = def ] is: 1 — because 'abc' really differs from 'def'
Однако bash и многие другие оболочки обычно не вызывают / bin / [
(или / usr / bin / [
) в этих случаях, но вместо этого вызовите встроенную команду с точно таким же поведением (исключительно из соображений производительности). Чтобы вызвать / bin / [
(не встроенный суррогат оболочки), вам нужно либо явно указать его путь (например, / bin / [hello]
; вам не нужно добавлять префикс ]
с именем каталога, хотя ☺ ), или настроить оболочку так, чтобы она не использовала встроенный суррогат (например, enable -n [
в bash).
С.С .: Как было сказано в других ответах, [
относится к тесту
. Но test
, в отличие от [
, не требует ]
в качестве последнего аргумента (и не ожидает этого вообще; добавление дополнительных ]]
- аргументы test
могут привести к сбою с сообщением об ошибке или возврату неправильного результата) . / bin / test
и / bin / [
могут разрешаться в один и тот же файл (например, один связан символической ссылкой ); в этом случае изменение поведения вероятно, реализовано путем анализа вызываемой в настоящее время команды в рамках тестового
/ [
кода) или в различных файлах. Для test
оболочка также обычно вызывает встроенный суррогат, если путь не указан явно ( / bin / test
) или не настроен так ( enable -n test
).
стр. П. С .: В отличие от test
и [
, современный if
никогда не является реальным файлом. Это часть синтаксиса оболочки (например, bash): if commandA; затем commandB; fi
(символы новой строки могут использоваться вместо точки с запятой) вызывает выполнение commandB
, если и только если commandA
завершился с нулевым статусом. Это идеально соответствует поведению теста
или [
, позволяя комбинировать их как if ["$ a" = foo]; тогда …; fi
(или , если test "$ a" = foo; тогда…; fi
- просто менее читаемый) .Однако современные скрипты часто используют [[
вместо test
или [
], которые (как if
) никогда не являются реальным файлом,но всегда является частью синтаксиса оболочки.
стр. П. П. С .: Что касается man
- никогда не ожидайте, что man
будет иметь статью о каждой команде в вашей файловой системе. Информация о некоторых (даже «настоящих», файловых) командах может отсутствовать, информация о некоторых встроенных оболочках может присутствовать не только в статье, посвященной конкретной оболочке (это место, где вы наверняка найдете информацию о ] тест
, [
, , если
, [[
). Тем не менее, во многих дистрибутивах есть явные man
-статьи для теста
и [
. (О - help
, он не распознается тестом
по очевидной причине: он должен спокойно обрабатывать такие случаи, как a = - help; test «$ a»
]; в некоторых дистрибутивах [--help
(без закрытия ]
) по-прежнему отображается справка, в некоторых - нет.)
По сравнению с моей системой у вас много файлов в /usr
, поэтому я бы посоветовал продолжить поиск там, если вы просто измените / От *
до *
в команде будет работать в любом каталоге. Однако, если вам не с чем сравнить цифры, это может стать трудным. Вот количество файлов, которые у меня есть в подкаталогах /usr
:
bin 2397
games 32
include 4607
lib 27379
local 34
sbin 271
share 1
src 22971
(сделано с для i в *; do echo -n "$i "; find $i |wc -l ; сделано
)