Что означают `[EXPRESSION], [] и [OPTION` в` man test`?

8

Изучая man test, я вижу, что под кратким описанием testесть возможности test EXPRESSIONи test.

Что [ EXPRESSION ], [ ] and [OPTIONзначит ниже?

Почему пустые скобки и почему [OPTIONпропущены скобки? Может кто-нибудь интерпретировать это для меня?

NAME
       test - check file types and compare values

SYNOPSIS
       test EXPRESSION
       test

       [ EXPRESSION ]
       [ ]
       [ OPTION
Shuzheng
источник

Ответы:

10

[это другое имя для test. Все три из этих строк являются командными строками, которые запускаются testс некоторыми опциями.

В первой строке это стандартное тестирование: [ 5 -gt 4 ]то же самое, что и test 5 -gt 4.

Во втором случае выражение опущено, что означает выход false ( 0 arguments: Exit false (1)).

В третьем случае, я полагаю, вы используете GNU coreutils. В GNU testтекст справки содержит эту заметку:

NOTE: [ honors the --help and --version options, but test does not.
test treats each of those as it treats any other nonempty STRING.

Это расширение не POSIX ; Похоже, мотивация заключается в том, что testэти аргументы следует рассматривать как строки, как и любые другие. [в состоянии отличить регистр варианта от регистра строки по наличию закрывающей ]скобки.

Обратите внимание, что ваша оболочка, скорее всего, предоставит свою собственную [, и вам придется /bin/\[использовать эту версию.

Майкл Гомер
источник
4

[это то же самое, что testи оболочка, встроенная в некоторые оболочки.

Если вы посмотрите дальше man test, он описывает, с какими действительными EXPRESSIONвы можете проверить:

Пропущенное выражение по умолчанию имеет значение false. В противном случае EXPRESSION имеет значение true или false и устанавливает статус выхода. Это один из: ...

Это не может быть очевидным для вас от человека-страницы, но в более старых / некоторых других оболочках, как [и testдоступны как фактические команды, это означает , что пространство вы видите [ EXPRESSION ]является обязательным для EXPRESSIONбыть принято в качестве аргумента для [/ test. Таким образом, даже для оболочек, которые предлагают их как встроенные, они сохраняют этот формат для совместимости.

И, как объясняется в ответе @ dr01 , пока я пишу это, правая квадратная скобка не обязательна.

ХИК
источник
@don_crissti спасибо за хедз-ап, думаю, я просто опущу это последнее предложение ...
hjk
0

[ OPTION на самом деле не хватает скобки.

На самом деле, что может быть удивительно, [команда (расположенная в /usr/bin/[) эквивалентна test. Поэтому было (по крайней мере, теоретически) разрешено использовать только левую скобку, а правая скобка служила синтаксическим сахаром. Тем не менее, новые версии оболочки требуют этого .

dr_
источник
Существуют ли другие различия между ними, testкоторые нельзя использовать с опцией (не указана с такой возможностью).
Шужэн
1
Это не разрешается опускать правую скобку, либо в POSIX или GNU [.
Майкл Гомер
@MichaelHomer Да. Исправлено.
Др_
Я не уверен, что Баш имеет отношение к этому ...
Майкл Гомер
1
@MichaelHomer, в POSIX, поведение, если вы опускаете правую скобку, не указано, поэтому POSIX- скрипту не разрешается опускать ], но POSIX [может делать то, что ему нужно, в том числе вызывать вас по именам и перезагружать компьютер или печатать сообщение справки. если вы позвоните без него. Это позволяет GNU grep«S [ --version. test --versionи, тем не [ --version ]менее, должны возвращать true (проверка на наличие --versionнепустой строки) и ничего не выводить.
Стефан Шазелас