Sự khác biệt giữa: và đúng là gì?


15

Trong bash:

$ type :
: is a shell builtin
$ type true
true is a shell builtin

Có vẻ như chúng giống nhau, nhưng chúng không đưa ra dấu vết hệ thống giống nhau:

$ strace :
strace: :: command not found
$ strace true
execve("/bin/true", ["true"], [/* 82 vars */]) = 0
[snip]
exit_group(0)                           = ?

Tôi đã thử tìm khác biệt strace bash -c : 2>:.txtstrace bash -c true 2>true.txt, nhưng không thể tìm thấy bất kỳ sự khác biệt nào giữa chúng ngoại trừ các vị trí bộ nhớ.

Trong dash:

$ type :
: is a special shell builtin
$ type true
true is a shell builtin

OK, vì vậy chúng không giống nhau. help :help truekhông hữu ích lắm, và chúng cũng trả lại như vậy trong bashdash. Có sự khác biệt thực tế nào giữa chúng không, ngoại trừ việc :tiết kiệm ba byte và làm cho các tập lệnh ít đọc hơn?


Câu trả lời:


27

Không có sự khác biệt thực sự trong hành vi. Cả hai lệnh không làm gì và thoát với trạng thái thành công. :nhấn mạnh không làm gì cả; truenhấn mạnh tình trạng thành công.

strace truehoạt động vì truelà cả shell dựng và lệnh bên ngoài ( /bin/true); :chỉ là một phần mềm dựng sẵn (không có /bin/:- mặc dù có thể có, và có lẽ là trên các hệ thống Unix rất cũ). Trong bash, hãy thử

type -a :
type -a true

Những lý do mà cả hai tồn tại là lịch sử. Nếu tôi nhớ lại một cách chính xác, một số shell rất sớm không có cú pháp nhận xét, vì vậy lệnh do-nothing :được sử dụng thay thế.

Có một số khác biệt nội bộ trong dash. Nhìn qua nguồn, có sẵn tại git: //git.kernel.org/pub/scm/utils/dash/dash.git, cho thấy một số đường dẫn mã khác nhau eval.c, nhưng tôi không thể tạo ra bất kỳ hành vi khác biệt rõ ràng nào khác hơn từ specialtrong đầu ra của type :.


8
Ngoài ra, các phiên bản đầu của UNIX không có /bin/truehoặc /bin/false. Ngoài ra, :lệnh đôi khi được sử dụng cho các tác dụng phụ xử lý đối số : : ${num_times:=10}.
Arcege

5
:ban đầu là một chỉ số nhãn , trở lại trong một tổ tiên của vỏ Bourne mà có goto. Rõ ràng :đã bị lạm dụng như một chỉ báo bình luận và bị mắc kẹt.
Gilles 'SO- ngừng trở thành ác quỷ'

1
Hành vi :như một chỉ báo nhãn cho goto được giữ nguyên trong bản sao dòng lệnh giả của Unix command.com, và vẫn còn trong kế của nó cmd.exe, cũng như thực hành lạm dụng ::cho nhận xét dòng.
Sorpigal

8

Chúng giống hệt nhau ở Bash. Nhìn vào builtins/colon.defmã nguồn Bash-4.2.

Trong lệnh của strace truebạn, bạn thực sự đang chạy nhị phân /bin/truethay vì bash tích hợp đúng.

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.