有时使用`read -t 3`代替`sleep 3`会更方便。我如何让它与“nohup”一起工作?

有时使用`read -t 3`代替`sleep 3`会更方便。我如何让它与“nohup”一起工作?

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 3ksh93现在也支持zsh,bash和的扩展mksh)意味着读取一行(逻辑的该行中的行可能会以尾随反斜杠继续,因为您不使用该-r选项)从标准输入$REPLY到 3 秒超时。

如果 stdin 是终端,那么除非用户按 Enter 键,否则它将休眠 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 是 stdin)指的是终端设备。

您可以这样做,但这会通过添加回与旨在防范的终端的交互read -t 3 < /dev/tty来达到目的。nohupnohup

相关内容