Apa tujuan dari braket persegi dieksekusi

27

Saya melihat ada executable yang disebut "[" di /usr/bin. Apa tujuannya?

masukkan deskripsi gambar di sini

Alexandru Irimiea
sumber

Jawaban:

33

Dalam kebanyakan kasus, [shell adalah builtin dan setara dengan test. Namun, seperti test, itu juga ada sebagai executable mandiri: itu yang /bin/[Anda lihat. Anda dapat menguji ini dengan type -a [(pada sistem Arch Linux, berjalan bash):

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

Jadi, pada sistem saya, saya punya dua [: builtin shell saya dan executable di /bin. Yang dapat dieksekusi didokumentasikan dalam 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.

[ ... ]

Seperti yang Anda lihat dalam kutipan halaman manual yang dikutip di atas, testdan [setara. The /bin/[dan /bin/testperintah yang ditentukan oleh POSIX yang mengapa Anda akan menemukan mereka meskipun fakta bahwa banyak kerang juga menyediakan mereka sebagai builtin. Kehadiran mereka memastikan bahwa konstruksi seperti:

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

akan berfungsi bahkan jika shell yang menjalankannya tidak memiliki [builtin. Misalnya, di tcsh:

> which [
/sbin/[
> set var = 11
> [ "$var" -gt 10 ]  && echo yes
yes
terdon
sumber
5
@AlexandruIrimiea apa maksudmu? Shell yang tidak memiliki [builtin hanyalah shell yang pembuatnya memutuskan untuk tidak menambahkannya. tcsh tidak memiliki sebuah [builtin misalnya.
terdon
7
@AlexandruIrimiea mereka bukan kerang "custom". Hanya saja itu bashhanya satu dari banyak program (cangkang) yang dirancang untuk melakukan pekerjaan serupa. Bash adalah salah satu sistem yang paling populer tetapi banyak kapal dengan shell default yang berbeda. Beberapa yang lebih dikenal adalah sh, bash, zsh, dash, ksh, tcsh, cshdan fish. Anda dapat melihat yang tersedia di sistem Anda dengan cat /etc/shellsdan sebagian daftar di sini .
terdon
1
@ JörgWMittag sungguh? Saya tahu bahwa Ubuntu shadalah dashtetapi saya pikir sistem penyelamatan /bin/shtidak menggunakan busybox. Apakah kamu yakin
terdon
2
Namun, memang ada busybox di initramfs, sebagaimana dibuktikan dari pertanyaan
Sergiy Kolodyazhnyy
1
@AlexandruIrimiea, mengenai perintah apa yang perlu ada di dalamnya dan perintah apa yang mungkin atau tidak ada di dalamnya , lihat posting ini .
Wildcard
12

Itu digunakan untuk pengujian kondisi dalam skrip shell. Nama lain dari program ini adalah test:

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

Itu terlihat seperti tata bahasa shell tetapi tidak. Biasanya [shell dibangun tetapi mungkin sebagai fallback itu ada sebagai perintah eksternal.

Lihat blok "EKSPRESI KONDISIONAL" di man bash.

Hauke ​​Laging
sumber
9

[adalah perintah yang sama dengan test. Pada beberapa sistem * nix, satu hanyalah tautan ke lainnya. Misalnya, jika Anda menjalankan:

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

Anda akan melihat output yang sama.

Sebagian besar sh-shells / posix-shells termasuk builtin [dan testperintah. Hal yang sama berlaku untuk echo. Ada banyak /bin/echoperintah dan builtin di sebagian besar shell. Itulah alasan mengapa terkadang Anda merasa bahwa, misalnya, echotidak bekerja dengan cara yang sama pada sistem yang berbeda.

testatau [hanya mengembalikan kode keluar 0atau 1. Jika tes berhasil, kode keluar adalah 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

Anda juga dapat menggunakan [dengan 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

Tetapi Anda dapat menggunakannya ifdengan setiap perintah, ifuntuk menguji kode keluar. Sebagai contoh:

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

Atau, menggunakan if:

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

Anda bisa mendapatkan hasil yang sama hanya menggunakan testperintah untuk menguji kode keluar yang disimpan ke variabel 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

Anda juga dapat menggunakan [[ ]]dan (( ))untuk pengujian, tetapi itu tidak sama dengan [dan test, meskipun memiliki sintaks yang hampir sama:

Akhirnya, untuk mengetahui apa itu perintah, Anda dapat menggunakan:

type -a command
kshji
sumber
Untuk membandingkan file Anda sebaiknya menggunakan cmp /usr/bin/[ /usr/bin/testatau mungkin hash sha256sum /usr/bin/[ /usr/bin/testtetapi tidak strings. Di sistem saya (openSUSE Tumbleweed) BTW mereka tidak sama (kenapa).
Hauke ​​Laging
Saya tidak bermaksud membandingkan byte. Dalam beberapa * nix mereka sama juga dalam byte level = tertaut. Tes
posix