Bash có một giấc ngủ "có thể tải", hỗ trợ các giây phân đoạn và loại bỏ các chi phí của lệnh bên ngoài:
$ cd bash-3.2.48/examples/loadables
$ make sleep && mv sleep sleep.so
$ enable -f sleep.so sleep
Sau đó:
$ which sleep
/usr/bin/sleep
$ builtin sleep
sleep: usage: sleep seconds[.fraction]
$ time (for f in `seq 1 10`; do builtin sleep 0.1; done)
real 0m1.000s
user 0m0.004s
sys 0m0.004s
Nhược điểm là các khả năng tải có thể không được cung cấp với bashnhị phân của bạn , vì vậy bạn sẽ cần phải tự biên dịch chúng như hiển thị (mặc dù trên Solaris, nó không nhất thiết phải đơn giản như trên).
Kể từbash-4.4 (tháng 9 năm 2016), tất cả các khả năng tải hiện được xây dựng và cài đặt theo mặc định trên các nền tảng hỗ trợ nó, mặc dù chúng được xây dựng dưới dạng các tệp đối tượng chia sẻ riêng biệt và không có .sohậu tố. Trừ khi distro / OS của bạn đã thực hiện một cái gì đó sáng tạo, thay vào đó bạn sẽ có thể làm:
[ -z "$BASH_LOADABLES_PATH" ] &&
BASH_LOADABLES_PATH=$(pkg-config bash --variable=loadablesdir 2>/dev/null)
enable -f sleep sleep
(Trang man ngụ ý BASH_LOADABLES_PATHđược đặt tự động, tôi thấy đây không phải là trường hợp trong bản phân phối chính thức kể từ ngày 4.4.12. Nếu và khi nó được đặt chính xác, bạn chỉ cần enable -f filename commandnametheo yêu cầu.)
Nếu điều đó không phù hợp, điều dễ nhất tiếp theo cần làm là xây dựng hoặc lấy sleeptừ lõi GNU, điều này hỗ trợ tính năng cần thiết. Lệnh POSIX sleeplà tối thiểu, các phiên bản Solaris cũ hơn chỉ thực hiện điều đó. Solaris 11 sleep không hỗ trợ giây.
Như một phương sách cuối cùng, bạn có thể sử dụng perl(hoặc bất kỳ tập lệnh nào khác mà bạn phải xử lý) với lời cảnh báo khởi tạo trình thông dịch có thể tương đương với thời gian ngủ dự định:
$ perl -e "select(undef,undef,undef,0.1);"
$ echo "after 100" | tclsh