如何在启动进程后10秒钟发送输入到Bash的标准输入?

3
我想要做的是:
  • 运行一个进程
  • 等待10秒钟
  • 向该进程的stdin发送一个字符串
这应该在一个bash脚本中完成。
我已经尝试过:
./script&
pid=$!
sleep 10
echo $string > /proc/${pid}/fd/0

在命令行中可以正常工作,但在脚本中运行时无法正常工作。


./script;pid=$!;sleep 10 |echo $string > /proc/${pid}/fd/0 - Srini V
在脚本内部呢? - user5547025
请参考我下面的回答;-) - Dilettant
我收到了一个文件未找到的消息。/proc/${pid}/fd/0 似乎不存在。 - Brahim
你确定需要等待吗?使用 echo "$string" | ./script,操作系统会缓冲 echo 的输出,直到 script 实际准备好读取它。(更准确地说,echo 会阻塞,直到 script 尝试从其标准输入读取。) - chepner
我的脚本从一开始就从stdin读取,并等待字符串“quit”停止。 - Brahim
2个回答

7
( sleep 10; echo "how you doin?" ) | ./script

如果你的脚本stdin是FIFO之类的东西,你的方法在Linux上可能有效:

myscript(){ tr a-z A-Z; }
rm -f p
mkfifo p
exec 3<>p
myscript <&3 &
pid=$!
echo :waiting
sleep 0.5
echo :writing
file /proc/$pid/fd/0
echo hi > /proc/$pid/fd/0
exec 3>&-

但是在不同的Unix操作系统上,/proc/$pid/fd的行为是不同的。

它对于您的情况无效,因为您的脚本标准输入是终端。 使用默认终端设置,终端驱动程序会让尝试从其读取数据的后台进程休眠(通过发送SIGTTIN信号),并且写入终端文件描述符将只会被回显--它们不会唤醒休眠的后台进程,该进程已经因尝试从终端读取而被挂起。


1

这个怎么样(正如OP请求的那样,在脚本中完成):

#! /bin/bash
./script&
pid=$!
sleep 10
echo $string > /proc/${pid}/fd/0

我只是提出缺失的元素,不评论编码风格 ;-)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接