1

我需要启动一个head命令,该命令将等待几秒钟的输入,但如果没有到达,它将中止。stdin不得关闭(因为以后的输入仍可用于其他读取过程。

我的第一种方法是使用标准超时模式:

head & pid=$! ; sleep 2; kill $pid

但不幸的是,当发送到后台时,head将不再从标准输入读取任何内容。

下一种方法是在后台执行超时操作:

(sleep 2; killall head) &
head

但这当然会杀死所有其他正在运行的head进程;找到合适的似乎很复杂。

有更好的方法吗?

4

3 回答 3

2

Use a named pipe instead of STDIN.

mkfifo /tmp/mypipe

head /tmp/mypipe &
pid=$!
sleep 2
kill $pid

or kill the PID of the parent script:

PID=$$
(sleep 2; kill $PID) &
head
于 2013-04-26T10:44:07.393 回答
2
~$ timeout --help
Usage: timeout [OPTION] DURATION COMMAND [ARG]...
  or:  timeout [OPTION]
Start COMMAND, and kill it if still running after DURATION.

So you would run timeout 2 head to kill head after 2 seconds (while producing no output because there is no input to head)

于 2013-04-28T01:03:06.713 回答
0

我现在正在使用这个:

for ((i=0; i<1000; i++))
do
  if IFS='' read -t 2 -N 1 a
  then
    echo -n "$a"
  else
    break
  fi
done

我一次读取一个字符,因为read在超时的情况下不会告诉我它读取了哪些未完成的数据。我也可以引入换行检测,但在我的情况下,特定数量的字节也可以。

于 2013-04-26T12:34:51.820 回答