1

因此,我在脚本中使用 coproc 命令来运行 java 程序并向其提供输入,如下所示:

#!/bin/bash

echo Script started.
coproc java -jar MultiThreadedFileProcessor.jar
echo start >&${COPROC[1]}
echo Script terminated.

我希望能够编写另一个脚本,该脚本可以将更多输入传递给该程序(例如,一个命令将告诉程序运行终止例程)。

有什么方法可以从另一个脚本访问协同进程的标准输入?我目前对终止脚本的尝试如下:

#!/bin/bash

echo Script started.
echo terminate >&${COPROC[1]}
echo close >&${COPROC[1]}
echo Script terminated.

但是,这给了我一个ambiguous redirect错误,我猜是因为 COPROC[1] 仅在创建 coproc 的脚本中定义。

如果有的话,我还能如何编写一个脚本来实现将一行传递给 java 程序的目标?

4

1 回答 1

0

COPROC 是第一个脚本的本地数组 - 您将永远无法从另一个脚本访问它。在 Linux 上,您可以访问 /proc/$pid/fd/$n,其中 $pid 是第一个脚本的 pid,$n 是存储在 ${COPROC[1]} 中的 fd。两者都必须在某个地方进行通信(一个 pid 文件和一个“fd 文件”),但在这种情况下,您最好不要创建一个命名管道 ( mkfifo) 并使用它而不是首先创建一个 coproc。像这样(未经测试)的代码:

脚本 1:

mkfifo fifoname
exec 5>fifoname
java <fifoname &
echo close >&5

脚本 2:

exec 5>fifoname
echo terminate >&5
echo close >&5

close命令应该做什么?java程序会看到

close
terminate
close

这对java程序有意义吗?

于 2020-09-02T05:26:00.160 回答