启动进程后 10 秒如何在 bash 中发送到 stdin?

Bra*_*him 2 linux bash

我想做的是:

  • 运行一个进程
  • 等待 10 秒
  • 向进程的标准输入发送一个字符串

这应该在 bash 脚本中完成。

我试过了:

./script&
pid=$!
sleep 10
echo $string > /proc/${pid}/fd/0
Run Code Online (Sandbox Code Playgroud)

它确实在 shell 中工作,但当我在脚本中运行它时就不行了。

PSk*_*cik 7

( sleep 10; echo "how you doin?" ) | ./script
Run Code Online (Sandbox Code Playgroud)

您的方法可能适用于 Linux,例如,您的脚本 stdin 类似于 FIFO:

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>&-
Run Code Online (Sandbox Code Playgroud)

但是这个/proc/$pid/fd东西在不同的Unices上表现不同。

它不适用于您的情况,因为您的脚本 stdin 是一个终端。使用默认终端设置,终端驱动程序会将尝试从中读取的后台进程置于睡眠状态(通过向它们发送 SIGTTIN 信号)并且写入终端文件描述符只会得到回显——它们不会唤醒正在休眠的后台进程试图从终端读取数据时进入睡眠状态。