Jaki jest cel wykonywalnego nawiasu kwadratowego

27

Widzę, że jest plik wykonywalny o nazwie „[” w /usr/bin. Jaki jest jego cel?

wprowadź opis zdjęcia tutaj

Alexandru Irimiea
źródło

Odpowiedzi:

33

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/testokreś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
terdon
źródło
5
@AlexandruIrimiea co masz na myśli? Powłoka, która nie ma [wbudowanego, jest po prostu powłoką, której autorzy postanowili nie dodawać żadnej. tcsh nie ma to [polecenie wbudowane na przykład.
terdon
7
@AlexandruIrimiea nie są to „niestandardowe” powłoki. To 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 .
terdon
1
@ JörgWMittag naprawdę? Wiedziałem, że Ubuntu shjest dash, ale myślałem, że korzysta z systemu ratownictwa /bin/shnie BusyBox. Jesteś pewny?
terdon
2
Jednak w initramfs jest rzeczywiście zajęty, jak wynika z tego pytania
Sergiy Kolodyazhnyy
1
@AlexandruIrimiea, na temat tego, jakie komendy trzeba mieć wbudowane i jakie komendy mogą, ale nie muszą, zobacz ten post .
Wildcard
12

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.

Hauke ​​Laging
źródło
9

[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
kshji
źródło
Do porównywania plików powinieneś raczej użyć, 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).
Hauke ​​Laging
Nie miałem na myśli porównywania bajtów. W niektórych * nix są one takie same również w poziomie bajtów = połączone. Test Posix
kshji