Bash

有時使用read -t 3代替sleep 3會很方便。如何使它與nohup一起使用?

  • February 1, 2018

有時使用它read -t 3代替sleep 3. 我如何使它與它一起工作nohup

nohup bash -c ' date; read -t 3; date ' | tail -n 2 nohup.out

如您所見,read -t 3不等待三秒鐘。

read -t 3ksh93現在也支持副檔名zsh,bashmksh)意味著從標準輸入讀取一行(該行中的邏輯行可能以尾隨反斜杠繼續,因為您不使用該-r選項)到$REPLY3 秒超時。

如果 stdin 是一個終端,它將休眠 3 秒,除非使用者按下輸入鍵(如果腳本在後台啟動,腳本將使用 SIGTTIN 信號掛起)。

如果它是一個正常文件,它將從中讀取該行並立即返回。如果是/dev/zero這樣,它將從那裡非常繁忙地讀取千兆字節的零,等等。

nohup是用於從終端分離命令的命令。它將 stdin 重定向到/dev/nullstdout 和 stderr 到nohup.out. 因此,在這種情況下,您通常不想從終端讀取。

readon/dev/null立即返回,不返回任何數據,這就是/dev/null目的。

如果使用的目的read -t是獲得一種可以被使用者(通過按下Enter)打斷的睡眠,比如當你想讓他們有時間閱讀他們可以跳過的消息時,那麼read -t在非互動時立即返回(就像在 下執行時一樣nohup)似乎是正確的做法,因為那時延遲腳本是沒有意義的。

但是,如果您想在 stdin 是終端時從終端讀取超時,否則要休眠,那麼您可以這樣做:

if [ -t 0 ]; then
 read -t 3
else
 sleep 3
fi

[ -t n ]測試文件描述符n(0 是標準輸入)是否指向終端設備。

您可以這樣做read -t 3 < /dev/tty,但這會破壞nohup通過添加與終端的互動nohup來防止的目的。

引用自:https://unix.stackexchange.com/questions/421189