Trong lịch sử , đạn Bourne không có true
và false
như là các lệnh tích hợp. true
thay vào đó chỉ đơn giản là bí danh :
và false
với một cái gì đó như let 0
.
:
tốt hơn một chút so true
với tính di động đối với đạn pháo có nguồn gốc từ Bourne cổ đại. Một ví dụ đơn giản, xem xét việc không có !
toán tử đường ống cũng như ||
toán tử danh sách (như trường hợp của một số shell Bourne cổ đại). Điều này để lại else
mệnh đề của if
câu lệnh là phương tiện duy nhất để phân nhánh dựa trên trạng thái thoát:
if command; then :; else ...; fi
Vì if
yêu cầu một then
mệnh đề không trống và các bình luận không được tính là không trống, :
đóng vai trò là không có.
Ngày nay (nghĩa là: trong một bối cảnh hiện đại) bạn thường có thể sử dụng :
hoặc true
. Cả hai đều được chỉ định bởi POSIX và một số tìm thấy true
dễ đọc hơn. Tuy nhiên, có một điểm khác biệt thú vị: :
được gọi là POSIX đặc biệt tích hợp , trong khi đó true
là tích hợp thông thường .
Xây dựng đặc biệt được yêu cầu phải được xây dựng vào vỏ; Các phần dựng sẵn thông thường chỉ được tích hợp "thông thường", nhưng nó không được bảo đảm nghiêm ngặt. Thường không nên có một chương trình thông thường được đặt tên :
với chức năng true
trong PATH của hầu hết các hệ thống.
Có lẽ sự khác biệt quan trọng nhất là với các tích hợp đặc biệt, bất kỳ biến nào được tích hợp sẵn - ngay cả trong môi trường khi đánh giá lệnh đơn giản - vẫn tồn tại sau khi lệnh hoàn thành, như được trình bày ở đây bằng cách sử dụng ksh93:
$ unset x; ( x=hi :; echo "$x" )
hi
$ ( x=hi true; echo "$x" )
$
Lưu ý rằng Zsh bỏ qua yêu cầu này, cũng như GNU Bash ngoại trừ khi hoạt động ở chế độ tương thích POSIX, nhưng tất cả các trình bao "POSIX sh có nguồn gốc" khác đều quan sát điều này bao gồm dash, ksh93 và mksh.
Một điểm khác biệt nữa là các phần dựng sẵn thông thường phải tương thích với exec
- được trình bày ở đây bằng Bash:
$ ( exec : )
-bash: exec: :: not found
$ ( exec true )
$
POSIX cũng lưu ý rõ ràng rằng :
có thể nhanh hơn true
, mặc dù đây tất nhiên là một chi tiết cụ thể thực hiện.