Odpowiedzi:
W większości przypadków [
jest wbudowana w powłokę i jest równoważna z test
. Jednak test
istnieje również jako samodzielny plik wykonywalny: to właśnie /bin/[
widziałeś. Możesz to przetestować za pomocą type -a [
(działającego systemu Arch Linux bash
):
$ type -a [
[ is a shell builtin
[ is /bin/[
W moim systemie mam dwa [
: wbudowaną powłokę i plik wykonywalny /bin
. Plik wykonywalny jest udokumentowany w 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.
[ ... ]
Jak widać we fragmencie strony podręcznika cytowanym powyżej test
i [
są one równoważne. Polecenia /bin/[
i /bin/test
są określone przez POSIX, dlatego je znajdziesz, mimo że wiele powłok udostępnia je również jako wbudowane. Ich obecność zapewnia, że konstrukty takie jak:
[ "$var" -gt 10 ] && echo yes
będzie działać, nawet jeśli uruchamiająca je powłoka nie ma [
wbudowanego. Na przykład w tcsh
:
> which [
/sbin/[
> set var = 11
> [ "$var" -gt 10 ] && echo yes
yes
bash
tylko jeden z wielu programów (powłok) zaprojektowanych do wykonywania podobnych zadań. Bash jest jednym z najpopularniejszych, ale wiele systemów jest dostarczanych z różnymi domyślnymi powłokami. Niektóre z nich są lepiej znane sh
, bash
, zsh
, dash
, ksh
, tcsh
, csh
i fish
. Możesz zobaczyć te dostępne w twoim systemie z cat /etc/shells
częściową listą tutaj .
sh
jest dash
, ale myślałem, że korzysta z systemu ratownictwa /bin/sh
nie BusyBox. Jesteś pewny?
Służy do testowania warunków w skryptach powłoki. Inna nazwa tego programu to test
:
if [ 1 -lt 2 ]; then ...
To wygląda na gramatykę powłoki, ale tak nie jest. Zwykle [
jest wbudowana w powłokę, ale prawdopodobnie jako awaria istnieje jako polecenie zewnętrzne.
Zobacz blok „WYRAŻENIA WARUNKOWE” w man bash
.
[
jest taka sama komenda jak test
. W niektórych systemach * nix jeden jest tylko linkiem do drugiego. Na przykład, jeśli uruchomisz:
strings /usr/bin/test
strings /usr/bin/[
zobaczysz to samo wyjście.
Większość powłok sh / shell posix zawiera wbudowane polecenia [
i test
polecenia. To samo dotyczy echo
. W /bin/echo
większości powłok jest zarówno polecenie, jak i wbudowane. To jest powód, dla którego czasami czujesz, że na przykład echo
nie działa tak samo na różnych systemach.
test
lub [
zwróć tylko kod wyjścia 0
lub 1
. Jeśli test się powiedzie, kod wyjścia to 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
Możesz także używać [
z 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
Ale można używać if
z każdym poleceniem, if
służy do testowania kodu wyjścia. Na przykład:
cp x y 2>/dev/null && echo cp x y OK || echo cp x y not OK
Lub używając if
:
if cp x y 2>/dev/null ; then
echo cp x y OK
else
echo cp x y not OK
fi
Ten sam wynik można uzyskać, używając tylko test
polecenia do przetestowania kodu wyjścia zapisanego w zmiennej 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
Możesz także używać [[ ]]
i (( ))
do testowania, ale nie są one takie same jak [
i test
, mimo że mają prawie taką samą składnię:
Wreszcie, aby dowiedzieć się, co to jest polecenie, możesz użyć:
type -a command
cmp /usr/bin/[ /usr/bin/test
a może skrótów, sha256sum /usr/bin/[ /usr/bin/test
ale nie strings
. W moim systemie (openSUSE Tumbleweed) BTW nie są takie same (dlaczego).
[
wbudowanego, jest po prostu powłoką, której autorzy postanowili nie dodawać żadnej.tcsh
nie ma to[
polecenie wbudowane na przykład.