В чем разница между квадратными скобками и тестовой командой в bash?

Я решил проблему, вызванную видеокартой, я просто добавил nouveau.modeset=0 в конец строки linux в grub

0
12.09.2020, 15:03
1 ответ

[и test— это одна и та же команда. Только [ожидает, что его последний аргумент будет ](, который в противном случае игнорируется ).

Команды [и testчасто реализуются одним и тем же двоичным файлом. Большинство Bourne -подобных оболочек и fishимеют встроенные [и test. Оболочка C или rcи их производные этого не делают. Оболочка C имеет специальные конструкции для выполнения некоторых операций, обычно выполняемых утилитой test/ [.

Команда testпоявилась в Unix V7 в конце 70-х вместе с новой оболочкой Bourne. В предыдущих версиях не было команды test, а в их оболочке не было конструкции if. Но была автономная ifкоманда , которая могла выполнять некоторые из тех же тестов, что и test, и выполнять команду в зависимости от результата.

Оболочка Bourne представила несколько операторов управления(if/ while/ until), поэтому testбыл введен в дополнение к этому, чтобы иметь команду, которую можно было бы использовать в части условия этих операторов для выполнения различные тесты.

В V7 не было команды [, но вы можете найти некоторый незавершенныйзакомментированный код встроенной команды [, предполагая, что они уже предусмотрели это к тому времени, но, вероятно, решил не загромождать им код shв то время.

Встроенные команды

[и testбыли добавлены в оболочку Bourne в System III в 1981 году .

Все Bourne -подобные оболочки, включая bash, с тех пор имеют [/ test, встроенные, но обратите внимание, что хотя оболочка Almquist имеет [/ test, встроенную -из start (фактически слился с expr), изначально он был отключен (и не компилировался в )в ранних BSD, а в некоторых — довольно поздно.

И [, и testявляются стандартными командами POSIX . Они не должны быть встроенными, но должны быть исполняемыми из таких вещей, как env, find -exec, execvp()и т. д., поэтому они должны быть доступны как автономный исполняемый файл.

Тем не менее, вы можете найти некоторые системы, которые предоставляют автономную testутилиту, но не [. Это объясняет, почему вы чаще видите такие вещи, как:

find. -exec test -f {} ';'

(эквивалентно GNU find-xtype f), чем:

find. -exec [ -f {} ] ';'

Что может привести к сбою в системах, не поставляющих автономную [утилиту.

В качестве еще одного неподтвержденного различия между [и test, посколькуtest <any-string>(так же, как [ <any-string> ]), является допустимым тестом, который проверяет, является ли <any-string>не пустым -, test --versionили test --helpне могут вернуть версию testили ее использование. Однако [ --versionне является допустимым тестом, поэтому вы обнаружите, что автономная утилита GNU [принимает --versionи --helpдля возврата информации о версии и использовании соответственно вместо обычного сообщения об ошибке missing ‘]’, когда GNU testне (не видит соответствующую фиксацию от 2003 г.(вводящий в заблуждение комментарий исправлено в 2005 г.)).

$ '/usr/bin/[' --version
[ (GNU coreutils) 8.30
[...]
$ /usr/bin/test --version && echo "--version is non-empty"
--version is non-empty
$ '/usr/bin/[' --something-else
/usr/bin/[: missing ‘]’
7
18.03.2021, 23:05

Теги

Похожие вопросы