Mã định danh mã thông báo của `]` là gì?


9

Hướng dẫn Bash nói:

Khi [biểu mẫu được sử dụng, đối số cuối cùng của lệnh phải là a].

$ type [
[ is a shell builtin
$ type ]
bash: type: ]: not found

Vì vậy, ]không phải là một từ dành riêng, nó cũng không phải là một toán tử, cũng không phải là một lệnh dựng sẵn.

Là một mã thông báo, định danh mã thông báo là ]gì? WORD hay TÊN?


4
Trên thực tế, [đây cũng là một lệnh tự duy trì: -rwxr-xr-x 1 root 39552 ngày 3 tháng 12 lúc 18 giờ 14 phút / usr / bin / [Mặc dù có thể cũng có "song song" tích hợp, giống như có ví dụ kill. Trên một số hệ thống, testlệnh là một liên kết tượng trưng đến [hoặc ngược lại. AFAIK, ]không có nghĩa là bất cứ điều gì, nhưng được chấp nhận để "đóng" a [- nhưng đó là vì lý do "thẩm mỹ".
Baard Kopperud

5
Ngôn ngữ shell đã phát triển từng lớp trong 46 năm qua và tính nhất quán nội bộ không bao giờ là ưu tiên hàng đầu. Nếu bạn cố gắng gắn nó vào bất kỳ khuôn khổ ngôn ngữ chính thức lý thuyết nào, bạn sẽ có một khoảng thời gian tồi tệ.
zwol

[(cũng) là một lệnh độc lập, nên nó thường có một trang man ... Vì vậy, hãy thử man [và / hoặc man test( [testcó thể là cùng một lệnh).
Baard Kopperud

Hãy thử dán các ]dấu ngoặc đơn hoặc kép và bạn sẽ thấy nó không có gì khác biệt; nó chỉ là một chuỗi
tự đại diện

Câu trả lời:


21

]bổ sung [, đó là dấu hiệu kết thúc của [lệnh.

Như mantrang chỉ ra, đây thực sự là một đối số [, nhưng [tình cờ coi nó là kết thúc.

Bạn có thể giống nó với một số mẫu đóng lệnh khác, ví dụ như ;trong find .. exec.


Cảm ơn. Loại / mã định danh của mã thông báo là ]gì?
Tim

8
@Tim ]không khác với bất kỳ nhân vật bình thường nào khác trong bối cảnh này (như là một đối số cho một lệnh). Các testlệnh xử lý nó đặc biệt, nhưng điều đó tùy thuộc vào lệnh.
muru

6
Nó chỉ là một chuỗi và [gây ra lỗi nếu đối số cuối cùng của nó không chính xác bằng ].
chepner

19

Bash không đối xử với [hoặc các ]ký tự (một mình) khác với một chữ cái trong bảng chữ cái.

Trong trường hợp này, bash thấy một "từ" [và tìm kiếm một lệnh có tên đó. Nếu bạn nhìn vào hệ thống tệp của mình, bạn có thể thấy rằng /bin/[(hoặc /usr/bin/[) tồn tại dưới dạng tệp thực thi. Khi điều đó xảy ra, bash cũng cung cấp một phiên bản tích hợp (vì mục đích hiệu quả), nhưng đó chỉ là một chi tiết triển khai.

Các [lệnh (như trong, thực thi với tên đó), có một quy tắc rằng tham số cuối cùng bạn vượt qua nó nên được ]hoặc nếu không nó ném một lỗi. Điều này có thể một phần vì nó mang tính thẩm mỹ, nhưng nó cũng phục vụ để bảo vệ bạn khỏi các lệnh vô tình bị cắt ngắn, điều này thật tuyệt.

Thực tế là những điều này không đặc biệt là lý do tại sao bạn không thể bỏ qua khoảng trắng trước và sau [hoặc ].


Ngoại lệ :

  • Khi []xảy ra ở định dạng đúng trong cùng một từ, ví dụ: [a-z]đó quy tắc kết nối đặc biệt và bash được áp dụng.
  • Các [[lệnh đặc biệt và có thể làm nhiều điều [không thể (và các thông số bên trong [[ .. ]]được xử lý khác nhau, như là một số ngắt dòng). Tương ứng ]]cũng đặc biệt, vì nó là một từ dành riêng shell không thể là tên lệnh và chấm dứt xử lý đặc biệt theo [[từ khóa.

1
@JacobKrall Nó không phải là một nhân vật đặc biệt như ;hoặc >, nó chỉ là một lệnh tích hợp như thế nào cd. Đặc biệt, nếu bạn gõ [x, [không có ý nghĩa đặc biệt.
Barmar

2
@JacobKrall Điều đó đúng với tất cả các lệnh tích hợp. [là một lệnh đặc biệt , nó không phải là một ký tự đặc biệt .
Barmar

@Barmar: Đủ công bằng; Tôi rút lại ý kiến ​​của mình.
Jacob Krall

Thật ra ]]còn đặc biệt hơn ]. Khi sử dụng []chúng chỉ là lời nói. Nếu bạn bỏ qua ]hoặc thay thế nó bằng một từ khác, bash sẽ vẫn chạy [, nhưng [sẽ gây ra lỗi. Tuy nhiên [[]]được đối xử đặc biệt tại thời điểm phân tích cú pháp. Nếu bạn thay thế ]]bằng thứ khác, bash sẽ báo lỗi cú pháp. Và nếu bạn bỏ qua ]]bash sẽ tiếp tục phân tích cú pháp tiếp theo để tìm kiếm ]].
kasperd 17/03/2016

@kasperd trả lời điều chỉnh.
am

3

Nói một cách đơn giản hơn hai câu trả lời trước, ]chỉ là một chuỗi [yêu cầu chạy.


1
Điều này có vẻ hơi giống một bình luận ...
wizzwizz4

@ wizzwizz4, đưa ra các câu hỏi tiếp theo từ OP trong các bình luận, tôi nghĩ sự đơn giản này chính xác là những gì anh ấy cần.
Wildcard

@Wildcard Tôi thực sự đồng ý. Có một cái gì đó hấp dẫn tôi để nâng cao câu trả lời này, nhưng tôi nghĩ rằng nó có chất lượng thấp. (Mặc dù không downvote!) Tôi sẽ chỉnh sửa để cải thiện đánh dấu.
wizzwizz4 17/03/2016
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.