Mục đích của khung vuông thực thi là gì


27

Tôi thấy có một thực thi được gọi là "[" trong /usr/bin. Mục đích của nó là gì?

nhập mô tả hình ảnh ở đây

Câu trả lời:


33

Trong hầu hết các trường hợp, [là một vỏ dựng sẵn và tương đương với test. Tuy nhiên, giống như test, nó cũng tồn tại như một thực thi độc lập: đó là những /bin/[gì bạn đã thấy. Bạn có thể kiểm tra điều này với type -a [(trên hệ thống Arch Linux, đang chạy bash):

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

Vì vậy, trên hệ thống của tôi, tôi có hai [: phần mềm dựng sẵn của tôi và phần thực thi /bin. Việc thực thi được ghi lại trong 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.

[ ... ]

Như bạn có thể thấy trong đoạn trích của trang man trích dẫn ở trên, test[tương đương. Các lệnh /bin/[/bin/testđược chỉ định bởi POSIX , đó là lý do tại sao bạn sẽ tìm thấy chúng mặc dù thực tế là nhiều shell cũng cung cấp chúng dưới dạng nội trang. Sự hiện diện của họ đảm bảo rằng các cấu trúc như:

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

sẽ hoạt động ngay cả khi lớp vỏ chạy chúng không có tích hợp [. Ví dụ tcsh: trong :

> which [
/sbin/[
> set var = 11
> [ "$var" -gt 10 ]  && echo yes
yes

5
@AlexandruIrimiea có nghĩa là gì? Một shell không có [dựng sẵn chỉ là một shell mà các tác giả quyết định không thêm nó. tcsh không có một [BUILTIN ví dụ.
terdon

7
@AlexandruIrimiea chúng không phải là vỏ "tùy chỉnh". Chỉ là đó bashchỉ là một trong nhiều chương trình (shell) được thiết kế để thực hiện các công việc tương tự. Bash là một trong những hệ thống phổ biến nhất nhưng nhiều hệ thống có vỏ mặc định khác nhau. Một số trong những người biết đến nhiều hơn là sh, bash, zsh, dash, ksh, tcsh, cshfish. Bạn có thể thấy những cái có sẵn trên hệ thống của bạn với cat /etc/shellsvà một danh sách một phần ở đây .
terdon

1
@ JörgWMittag thật sao? Tôi biết rằng Ubuntu shdashnhưng tôi nghĩ hệ thống cứu hộ /bin/shkhông sử dụng busybox. Bạn có chắc không?
terdon

2
Tuy nhiên, thực sự có một
hộp bận rộn

1
@AlexandruIrimiea, liên quan đến những lệnh nào cần thiết để xây dựng và những lệnh nào có thể hoặc không thể được xây dựng, xem bài đăng này .
tự đại diện

12

Điều đó được sử dụng để kiểm tra điều kiện trong các kịch bản shell. Một tên khác của chương trình này là test:

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

Trông giống như ngữ pháp shell nhưng không phải. Thường [là shell dựng sẵn nhưng có lẽ là dự phòng, nó tồn tại như một lệnh bên ngoài.

Xem khối "GIẢI THÍCH ĐIỀU KIỆN" trong man bash.



9

[là lệnh tương tự như test. Trên một số hệ thống * nix, một hệ thống chỉ là một liên kết với nhau. Ví dụ: nếu bạn chạy:

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

bạn sẽ thấy đầu ra tương tự.

Hầu hết các sh-shell / posix-shell bao gồm các lệnh dựng sẵn [testlệnh. Điều này cũng đúng với echo. Có cả /bin/echolệnh và nội trang trong hầu hết các shell. Đó là lý do tại sao đôi khi bạn cảm thấy rằng, ví dụ, echokhông hoạt động theo cùng một cách trên các hệ thống khác nhau.

testhoặc [chỉ trả lại mã thoát của 0hoặc 1. Nếu thử nghiệm thành công, mã thoát là 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

Bạn cũng có thể sử dụng [với 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

Nhưng bạn có thể sử dụng ifvới mọi lệnh, ifđể kiểm tra mã thoát. Ví dụ:

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

Hoặc, sử dụng if:

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

Bạn có thể nhận được kết quả tương tự bằng cách chỉ sử dụng testlệnh để kiểm tra mã thoát được lưu vào biến 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

Bạn cũng có thể sử dụng [[ ]](( ))để thử nghiệm, nhưng chúng không giống nhau [test, mặc dù có cùng một cú pháp:

Cuối cùng, để tìm hiểu lệnh là gì, bạn có thể sử dụng:

type -a command

Để so sánh các tập tin, bạn nên sử dụng cmp /usr/bin/[ /usr/bin/testhoặc có thể băm sha256sum /usr/bin/[ /usr/bin/testnhưng không strings. Trên hệ thống của tôi (openSUSE Tumbleweed) BTW chúng không giống nhau (tại sao).
Hauke ​​Laging

Tôi không có nghĩa là so sánh byte. Trong một số * nix chúng giống nhau ở mức byte = được liên kết. Thử nghiệm Posix
kshji
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.