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 bash
nhị 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ó .so
hậ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 commandname
theo 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 sleep
từ lõi GNU, điều này hỗ trợ tính năng cần thiết. Lệnh POSIX sleep
là 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