Odpowiedzi:
W większości przypadków [jest wbudowana w powłokę i jest równoważna z test. Jednak testistnieje 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 testi [są one równoważne. Polecenia /bin/[i /bin/testsą 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
bashtylko 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, cshi fish. Możesz zobaczyć te dostępne w twoim systemie z cat /etc/shellsczęściową listą tutaj .
shjest dash, ale myślałem, że korzysta z systemu ratownictwa /bin/shnie 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 testpolecenia. To samo dotyczy echo. W /bin/echowiększości powłok jest zarówno polecenie, jak i wbudowane. To jest powód, dla którego czasami czujesz, że na przykład echonie działa tak samo na różnych systemach.
testlub [zwróć tylko kod wyjścia 0lub 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ć ifz każdym poleceniem, ifsł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 testpolecenia 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/testa może skrótów, sha256sum /usr/bin/[ /usr/bin/testale 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.tcshnie ma to[polecenie wbudowane na przykład.