来自文件(脚本)的输入

来自文件(脚本)的输入

我有这个过程:

$ bash start.sh

我运行这个命令:

$ pidof bash

并收到此:

9427

我想在脚本 stdin 中运行命令(脚本有自己的命令) 我想运行命令“ give 1 shotgun to player
我试过这个:

$ give 1 shotgun to player > /proc/9427/fd/0

但我得到了这个:

-bash: give: command not found

之后,我尝试了这个:

$ echo "give 1 shotgun to player" > /proc/9427/fd/0

give 1 shotgun to player但是在进程中写入了消息“ ”,但是脚本的命令没有被激活!

答案1

您无法拦截进程中已经存在的 stdin,至少不是按照您尝试的方式。请参阅写入进程的标准输入了解详情。

有两个基本选项可以使用 stdin 从另一个进程控制一个进程,但必须在启动进程时指定它们。

来自文件(脚本)的输入

如果您可以在启动要控制的进程之前准备好整个输入,请创建一个文件并将其用作受控进程的标准输入。示例:

$ cat commands
give 1 shotgun to player
shoot

$ ./start.sh < commands

来自流程的输入

如果您使用另一个程序发出控制进程的命令,请使用管道符号 ( |) 连接它们。以下示例显示了如何简单地控制什么时候发出命令。

$ cat controller.sh
#!/bin/sh
sleep 5
echo "give 1 shotgun to player"
sleep 2
echo "shoot"

$ ./controller.sh | ./start.sh

这样,您也可以使用echo您尝试模拟脚本选项而不使用任何脚本文件:

$ echo "give 1 shotgun to player\nshoot" | ./start.sh

答案2

问答Melebius 链接到实际上提供了一个解决方案,让您可以写入stdin另一个进程:

使用mkfifo您可以创建一个命名管道。然后,您可以将stdin进程重定向到命名管道,并从另一个进程向其写入数据:

$ mkfifo myfifo.pipe
$ ./start.sh < myfifo.pipe

... 从另一个终端:

$ echo "give 1 shotgun to player" > myfifo.pipe

相关内容