Linux
如何在 bash 或 ksh 中睡一毫秒
sleep 是一個非常流行的命令,我們可以從 1 秒開始休眠:
# wait one second please sleep 1
但是如果我只需要等待 0.1 秒或 0.1 到 1 秒之間,還有什麼選擇?
- 備註:在 linux 或 OS X 上**
sleep 0.XXX
工作正常,但在 solarissleep 0.1
或sleep 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