read -t 3
有时使用代替 更方便sleep 3
。我如何让它与 一起工作nohup
?
nohup bash -c ' date; read -t 3; date ' | tail -n 2 nohup.out
正如你所看到的,read -t 3
没有等待三秒钟。
答案1
read -t 3
(ksh93
现在也支持zsh
,bash
和的扩展mksh
)意味着读取一行(逻辑的该行中的行可能会以尾随反斜杠继续,因为您不使用该-r
选项)从标准输入$REPLY
到 3 秒超时。
如果 stdin 是终端,那么除非用户按 Enter 键,否则它将休眠 3 秒(如果脚本在后台启动,则脚本将通过 SIGTTIN 信号挂起)。
如果它是常规文件,它将从中读取该行并立即返回。如果是的话,/dev/zero
它将非常繁忙地从那里读取千兆字节的零,等等。
nohup
是用于从终端分离命令的命令。它将 stdin 重定向到/dev/null
stdout 和 stderr 到nohup.out
.所以通常你会不是在这种情况下想从终端读取。
read
on/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 是 stdin)指的是终端设备。
您可以这样做,但这会通过添加回与旨在防范的终端的交互read -t 3 < /dev/tty
来达到目的。nohup
nohup