我需要启动一个head
命令,该命令将等待几秒钟等待输入,但如果没有输入,则将中止。stdin
不得关闭(因为以后的输入仍可用于其他读取过程。
我的第一种方法是使用标准的超时模式:
head & pid=$! ; sleep 2; kill $pid
但不幸的是,当发送到后台时,head
将不再从stdin读取任何内容。
下一种方法是在后台进行超时操作:
(sleep 2; killall head) &
head
但这当然会杀死所有其他正在运行的head
进程;找到合适的似乎很复杂。
有更好的方法吗?
使用命名管道而不是STDIN
。
mkfifo /tmp/mypipe
head /tmp/mypipe &
pid=$!
sleep 2
kill $pid
或者终止父脚本的PID:
PID=$$
(sleep 2; kill $PID) &
head
~$ timeout --help
Usage: timeout [OPTION] DURATION COMMAND [ARG]...
or: timeout [OPTION]
Start COMMAND, and kill it if still running after DURATION.
因此,您将运行timeout 2 head
以在2秒后杀死head
(同时由于head
没有输入而不产生输出(
我现在使用的是:
for ((i=0; i<1000; i++))
do
if IFS='' read -t 2 -N 1 a
then
echo -n "$a"
else
break
fi
done
我一次读取一个字符,因为read
在超时时不会告诉我它读取了哪些未完成的数据。我也可以引入换行检测,但在我的情况下,特定数量的字节也可以。