Я всегда удивляюсь, что в папке /bin
есть [
программа.
Это то , что называется , когда мы делаем что - то вроде: if [ something ]
?
Вызывая [
программу явно в оболочке, она запрашивает соответствующую ]
, а когда я предоставляю закрывающую скобку, она, кажется, ничего не делает, независимо от того, что я вставляю в скобки.
Излишне говорить, что обычный способ получения справки о программе не работает, то есть ни работает, man [
ни [ --help
работает.
[
относится кtest
команде, хотя, нетexpr
, так и должно бытьman test
man '['
у меня работает нормально - либо вы забыли процитировать,[
либо у вас другое определение "работы".[
оценивает его аргументы, поэтому вам нужно иметь пробелы между ними.[ a=b ]
это не сравнение: это всегда будет true (это одна строка: «a = b», которая всегда оценивается как true ). И вам следует ограничить число аргументов до 4 (даже если недавние реализации позволят больше .. Ограничение до 4 делает его более переносимым. Например:[ "a" = "b" ]
уже имеет 4 аргумента: "a" "=" "b" и необязательный конец теста arg: "]"). Если вам нужно больше: цепные тесты, например:if [ "$Var_a" = "foo" ] && [ "$Var_b" = "bar" ] ; then : do something ; fi
!
сам по себе (без экранирования и без кавычек) не будет заменен, а еще лучшеif ! [ ...
. Все расширения bash, которые используют,!
включают как минимум другого персонажа[
вbash
(и, возможно, в других оболочках) также есть -буилтин , и что он может быть использован вместо/bin/[
. Также есть командаtest
-com, которая во многих системах является символической ссылкой/bin/[
(или наоборот), а в других - отдельной командой.Ответы:
Работа
[
команды заключается в оценке тестовых выражений. Возвращается со статусом выхода 0 (что означает true ), когда выражение разрешается в true, а в противном случае (что означает false ) в противном случае.Дело не в том, что он ничего не делает, просто его результат находится в статусе выхода. В оболочке вы можете узнать о состоянии завершения последней команды
$?
для оболочек типа Борна или$status
большинства других оболочек (fish / rc / es / csh / tcsh ...).В других языках, например
perl
, статус выхода возвращается, например, в возвращаемом значенииsystem()
:Обратите внимание, что все современные Bourne-подобные оболочки (и
fish
) имеют встроенную[
команду. Один в/bin
обычно выполняются только тогда , когда вы используете другую оболочку или когда вы делаете что - то вродеenv [ foo = bar ]
илиfind . -exec [ -f {} ] \; -print
или чтоperl
команды выше ...Команда
[
также известна подtest
именем. Когдаtest
вызывается как , он не требует закрывающего]
аргумента.Хотя ваша система может не иметь справочную страницу для
[
, она, вероятно, есть дляtest
. Но опять же, обратите внимание, что это будет документировать/bin/[
или/bin/test
реализацию. Чтобы узнать о[
встроенной функции в вашей оболочке, вам следует прочитать документацию по вашей оболочке.Для получения дополнительной информации об истории этой утилиты и разнице с
[[...]]
тестовым выражением ksh вы можете посмотреть здесь другие вопросы и ответы .источник
[
. Я не помню, был ли это вариант Борна или античная версия пепла.[
и реализована вtest
виде встроенных компонентов . До этого не было[
иtest
было только внешней двоичной команды.find . -exec [ f {} ] \; -print
? Командаfind . -type f -print
будет делать то же самое , так что гораздо более эффективно ...Вы правильно удивлены. Это одна из редких команд POSIX с утилитой null (
:
), которая не соблюдает соглашение о допустимых символах командного файла (набор символов переносимого имени файла).Точно, но это может использоваться без
if
слишком.Он ничего не делает видимым, но на самом деле он делает то же самое, что и при использовании с ним
if
, то есть он устанавливает состояние выхода на 0 (true) или что-либо еще (false) в зависимости от того, что вы заключили в скобки. Это (по причине) такое же поведение, какtest
команда; единственная разница в том, что он ищет концовку]
. Смотритеman test
подробности.Это зависит от вашей операционной системы.
man [
определенно работает для меня в нескольких основных дистрибутивах Gnu / Linux, но не в Solaris.[ --help
может работать или не работать в зависимости от реализации, так как в любом случае нарушает синтаксис, пропуская окончание]
. Кроме того, стандарт POSIX дляtest
/[
команды явно исключает все возможные варианты, в том числе--
прекращение вариант так как[ --help ]
иtest --help
необходимости возвращенияtrue
и молчать дизайн. Обратите внимание, что вы положили в скобках или после того, как[
и что выглядят как варианты (например-f file
,-n string
и подобные) не являются варианты , но операнды .Все современные Bourne интерпретаторы стиль оболочки (как
bash
,ksh
,dash
иzsh
некоторые из них) реализацииtest
/[
утилиты внутри как встроенная , так когда вы используете их, страница право руководство для обозначения может быть одна из оболочки, а неtest
один.До Unix System III (1981) оболочка Bourne не реализовывала
test
утилиту как встроенную, поэтому была доступна только реализация внешних двоичных команд. До[
Unix System III не было ни команды (внутренней или встроенной), поэтому, например, в Unix версии 7 вы должны были набрать:вместо:
источник
man test
работает, но нетman [
С другой стороны, моя среда cygwin знает об этомman [
!man [
похоже, не работает на Manjaro (Arch Linux на основе). Руководство дляtest
списков[ --help
в качестве действительного вызова, которое должно показывать помощь, но, что интересно, это не так, и вместо этого жалуется на отсутствие]
, так же, как и с--version
. Добавление]
ничего не делает, поэтому кажется невозможным получить помощь, кроме как отman test
./usr/bin/[ --help
или/bin/[ --help
.env [ --help
а также/usr/bin/[ --help
работает совершенно нормально (хотя мне нужно цитировать/usr/bin/[
или жш жалуется).[
на самом деле более широко известен какtest
команда. Типичное использование этой команды - просто оценить выражения и вернуть их условие - true или false. Он часто используется вif-then-else-fi
операторах, хотя он может использоваться внеif
операторов для условного запуска других команд через оболочки&&
или||
операторы, например, так.Более конкретно, оценка передается другим командам через состояние выхода. Некоторые программы могут выбрать вывод состояния выхода для обозначения различных типов событий - программа успешно завершена, ошибка определенного типа, возникающая во время выполнения, или синтаксические ошибки. В случае
test
команды есть0
означает истину и1
означает ложь. Как указал Стефан, синтаксические ошибки приводят к состоянию выхода2
.Его местоположение зависит от вашей системы, и это также объясняет, почему вы не видели страницу руководства, когда вы это сделали
man [
. Например, на FreeBSD он находится под/bin
. В Linux (или в моем конкретном случае, Ubuntu 16.04) он находится в/usr/bin/
. Если вы это делаетеman [
илиman test
работаете в системе Linux, вы увидите ту же документацию открытой. Также важно отметить, что ваша оболочка может иметь собственную реализациюtest
.Следует также отметить, что у этой команды есть проблемы , которые пытается решить реализация оболочки Korn (обычно называемая ссылкой «условное выражение» в двойных квадратных скобках
[[ "$USER" = "root" ]]
). Эта функция также используется другими оболочками, такими какbash
иzsh
.источник
/usr/bin/
для Amazon Linux также.В некоторых дистрибутивах (например, Ubuntu)
man [
следует символическая ссылка наtest(1)
. На других (например, Арка) это не так. (Ноtest
страница руководства[
также документирует использование )type -a [
показывает, что есть встроенная оболочка и исполняемый файл.bash-builtin
[ --help
просто печатает сообщение об ошибке. (Но так как это встроенная версия, вы можете использовать ееhelp [
или просмотреть страницу руководства / документацию по bash)./usr/bin/[ --help
выводит полный вывод справки (для версии GNU Coreutils), который начинается с:а затем описывает допустимый синтаксис для EXPRESSION.
Это еще один способ, которым вы могли бы узнать это
[
иtest
эквивалентны.Кстати, если вы программируете для bash (или пишете однострочно в интерактивном режиме), я бы порекомендовал
[[
вместо[
. Это лучше несколькими способами, см. Ссылки в ответе Серга.источник
[
команда возвращает нулевое состояние выхода, если выражение, содержащееся в ее аргументах, считается истинным, а ненулевое состояние выхода, если выражение, содержащееся в его аргументах, считается ложным. Он также завершается с сообщением об ошибке, если его последний аргумент не является]
(это делается исключительно по эстетическим соображениям).Например:
… Выведет:
Однако 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
(без закрытия]
) по-прежнему показывает помощь, в некоторых - нет).источник
if
была команда до Unix V6. Unix V7 (1979) поставляется с оболочкой Bourne (с ееif-then-else-fi
конструкцией) и новойtest
командой.