Какова цель квадратной скобки исполняемого файла

27

Я вижу, что есть исполняемый файл с именем "[" в /usr/bin. Какова его цель?

введите описание изображения здесь

Александру Иримея
источник

Ответы:

33

В большинстве случаев [является встроенной оболочкой и эквивалентна test. Однако, вроде бы test, он также существует как отдельный исполняемый файл: это то, что /bin/[вы видели. Вы можете проверить это с помощью type -a [(в системе Arch Linux, запущенной bash):

$ type -a [
[ is a shell builtin
[ is /bin/[

Итак, в моей системе их два [: встроенная оболочка и исполняемый файл /bin. Исполняемый файл задокументирован в man test:

TEST(1)                          User Commands                         TEST(1)

NAME
       test - check file types and compare values

SYNOPSIS
       test EXPRESSION
       test

       [ EXPRESSION ]
       [ ]
       [ OPTION

DESCRIPTION
       Exit with the status determined by EXPRESSION.

[ ... ]

Как вы можете видеть в выдержке страницы человека цитировал выше, testи [являются эквивалентными. /bin/[И /bin/testкоманды определяются POSIX поэтому вы найдете их , несмотря на то , что многие снаряды также обеспечить их внутренние команды. Их присутствие гарантирует, что такие конструкции как:

[ "$var" -gt 10 ]  && echo yes

будет работать, даже если оболочка, в которой они запущены, не имеет [встроенной функции. Например, в tcsh:

> which [
/sbin/[
> set var = 11
> [ "$var" -gt 10 ]  && echo yes
yes
Тердон
источник
5
@AlexandruIrimiea что ты имеешь в виду? Оболочка, в которой нет [встроенной функции, - это просто оболочка, авторы которой решили ее не добавлять. tcsh не имеет на [встроенную команду, например.
Тердон
7
@AlexandruIrimiea это не "обычные" оболочки. Это всего bashлишь одна из многих программ (оболочек), которые предназначены для выполнения подобных задач. Bash является одной из самых популярных, но многие системы поставляются с различными оболочками по умолчанию. Некоторые из наиболее известных из них являются sh, bash, zsh, dash, ksh, tcsh, cshи fish. Вы можете увидеть список доступных в вашей системе cat /etc/shellsи частичный список здесь .
Terdon
1
@ JörgWMittag действительно? Я знал, что Ubuntu shесть, dashно я думал, что система спасения использует /bin/shне busybox. Вы уверены?
Terdon
2
Однако в initramfs действительно есть занятая коробка, о чем свидетельствует этот вопрос
Сергей Колодяжный
1
@AlexandruIrimiea, относительно того, что это за команды необходимо и какие команды можно или нельзя смотрите в этом посте .
Wildcard
12

Это используется для проверки состояния в сценариях оболочки. Другое название этой программы test:

if [ 1 -lt 2 ]; then ...

Это похоже на грамматику оболочки, но это не так. Обычно [это встроенная оболочка, но, вероятно, в качестве запасного варианта она существует как внешняя команда.

Смотрите блок "УСЛОВНЫЕ ВЫРАЖЕНИЯ" в man bash.

Хауке Лагинг
источник
9

[это та же команда, что и test. В некоторых системах * nix одна просто ссылка на другую. Например, если вы запустите:

strings /usr/bin/test 
strings /usr/bin/[

вы увидите тот же результат.

Большинство sh-оболочек / posix-оболочек включают встроенные команды [и testкоманды. То же самое верно для echo. Существует как/bin/echo большинстве оболочек команда, и встроенная функция. Вот почему иногда вы чувствуете, что, например, echoне работает одинаково на разных системах.

testили [верните только код выхода 0или 1. Если тест прошел успешно, код выхода равен 0.

# you can use [ command but last argument must be ] 
# = inside joke for programmers 
# or use test command. Args are same, but last arg can't be ] :)
# so you can't write 
#    [-f file.txt] because [-f is not command and last argument is not ]
# after [ have to be delimiter as after every commands
[ -f file.txt ] && echo "file exists" || echo "file does not exist"
test -f file.txt && echo "file exists" || echo "file does not exist"
[ 1 -gt 2 ] && echo yes || echo no
test 1 -gt 2  && echo yes || echo no
# use external command, not builtin
/usr/bin/[ 1 -gt 2 ] && echo yes || echo no

Вы также можете использовать [с if:

if [ -f file.txt ] ; then
  echo "file exists" 
else 
  echo "file does not exist"
fi
# is the same as
if test -f file.txt  ; then
  echo "file exists" 
else 
  echo "file does not exist"
fi

Но вы можете использовать ifс каждой командой, ifдля тестирования кода выхода. Например:

cp x y 2>/dev/null && echo cp x y OK ||  echo cp x y not OK

Или, используя if:

if cp x y 2>/dev/null ; then
   echo cp x y OK
else
   echo cp x y not OK
fi

Вы можете получить тот же результат, используя только testкоманду для проверки кода завершения, который сохраняется в переменнойstat :

cp x y 2>/dev/null 
stat=$?
if test "$stat" = 0 ; then
   echo cp x y OK
else
   echo cp x y not OK
fi

Вы также можете использовать [[ ]]и (( ))для тестирования, но это не то же самое, что[ и test, несмотря на то, что они имеют почти такой же синтаксис:

Наконец, чтобы узнать, что такое команда, вы можете использовать:

type -a command
kshji
источник
Для сравнения файлов вы должны использовать cmp /usr/bin/[ /usr/bin/testили, может быть, хэши, sha256sum /usr/bin/[ /usr/bin/testно нет strings. В моей системе (openSUSE Tumbleweed) Кстати, они не одинаковы (как бы то ни было).
Хауке Лагинг
Я не имел в виду сравнение байтов. В некоторых * nix они одинаковы и на уровне байтов = связаны. Тест Posix
kshji