Linux

如何在 bash 或 ksh 中睡一毫秒

  • February 11, 2022

sleep 是一個非常流行的命令,我們可以從 1 秒開始休眠:

# wait one second please 
sleep 1

但是如果我只需要等待 0.1 秒或 0.1 到 1 秒之間,還有什麼選擇?

  • 備註:在 linux 或 OS X 上**sleep 0.XXX工作正常,但在 solarissleep 0.1sleep 0.01**- 非法語法

Bash 有一個“可載入”的睡眠,它支持小數秒,並消除了外部命令的成本:

$ cd bash-3.2.48/examples/loadables
$ make sleep && mv sleep sleep.so
$ enable -f sleep.so sleep

然後:

$ 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

缺點是您的二進製文件可能沒有提供可載入bash文件,因此您需要自己編譯它們,如圖所示(儘管在 Solaris 上不一定像上面那樣簡單)。

bash-4.4(2016 年 9 月)起,所有可載入項現在都預設建構並安裝在支持它的平台上,儘管它們是作為單獨的共享對象文件建構的,並且沒有.so後綴。除非你的發行版/作業系統做了一些創造性的事情(遺憾的是 RHEL/CentOS 8 建構時故意bash-4.4刪除了可載入的擴展),否則你應該可以這樣做:

[ -z "$BASH_LOADABLES_PATH" ] &&
 BASH_LOADABLES_PATH=$(pkg-config bash --variable=loadablesdir 2>/dev/null)  
enable -f sleep sleep

(手冊頁暗示BASH_LOADABLES_PATH是自動設置的,我發現在 4.4.12 的官方發行版中不是這種情況。如果設置正確,你只需要enable -f filename commandname根據需要。)

如果這不合適,接下來最簡單的做法是sleep從 GNU coreutils 建構或獲取,這支持所需的功能。POSIXsleep命令是最小的,舊的 Solaris 版本只實現了它。Solaris 11sleep 確實支持小數秒。

作為最後的手段,您可以使用perl(或您必須處理的任何其他腳本)並註意初始化解釋器可能與預期的睡眠時間相當:

$ perl -e "select(undef,undef,undef,0.1);"
$ echo "after 100" | tclsh

引用自:https://serverfault.com/questions/469247