Відповіді:
У більшості випадків [
це вбудована оболонка і еквівалентна 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
bash
це лише одна з багатьох програм (оболонок), розроблених для виконання подібних робіт. Bash - одна з найпопулярніших, але багатьох системних суден з різними оболонками за замовчуванням. Деякі з найбільш відомих з них є sh
, bash
, zsh
, dash
, ksh
, tcsh
, csh
і fish
. Ви можете ознайомитись з тими, які доступні у вашій системі, cat /etc/shells
та частковий список тут .
sh
є , dash
але я думав , що рятувальна система використовує /bin/sh
НЕ BusyBox. Ти впевнений?
Це використовується для тестування стану в скриптах оболонки. Ще одна назва цієї програми test
:
if [ 1 -lt 2 ]; then ...
Це схоже на граматику оболонки, але це не так. Зазвичай [
це вбудована оболонка, але, ймовірно, резервна вона існує як зовнішня команда.
Дивіться блок "УМОВНІ ВИРАЗИ" в man bash
.
[
така ж команда, як і 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
cmp /usr/bin/[ /usr/bin/test
або, можливо, хеші, sha256sum /usr/bin/[ /usr/bin/test
але ні strings
. У моїй системі (openSUSE Tumbleweed) BTW вони не однакові (чому б то не було).
[
вбудованого, - це просто оболонка, автори якої вирішили не додавати її.tcsh
не має на[
вбудовану команду, наприклад.