将输入重定向到后台运行的脚本

时间:2018-09-05 17:40:18

标签: linux bash io background-process

我写了一个脚本来调整窗口的大小,它需要分数形式的方向和值,像这样:

resize.sh -h 1/2

,它按预期工作。 我还添加了-k标志,这意味着脚本需要用户输入,如下所示:

resize.sh -k -h

并在脚本中:

read -rsn 2 fraction

我解析以获得分子和分母的值。

这在命令行上很好用,但是其背后的思想是将resize.sh -k -h绑定到某个组合键,并在后面跟随两个键作为输入。但是,当我从键盘运行脚本时,该脚本作为与任何tty无关的后台进程运行,因此read无法获得其输入。从键盘运行全局输入后,是否可以将全局输入重定向到后台进程。

到目前为止我尝试过的事情:

  • 重定向到/ proc / $$ / fd / 0,该操作无效。

  • 重定向g当前正在读取的tty stdin,如下所示:
    read -rsn 2 fraction < /dev/pts/0

确实有效,但是问题在于并非所有窗口都是终端,例如网络浏览器。

如果我的问题不清楚,请随时要求其他澄清或详细信息,并预先致谢:)

2 个答案:

答案 0 :(得分:0)

您可以使用命名管道进行过程通信。 我制作了一个示例脚本,其中后台进程是一个函数。

#!/bin/bash
pipe_name=/tmp/mypipe$$
mkfifo "${pipe_name}"

resize()
{
   read fraction < "${pipe_name}"
   echo "Resize window to fraction=${fraction}"
}

resize &
read -p "Enter your fraction: "
echo "${REPLY}" > "${pipe_name}"

rm "${pipe_name}"

答案 1 :(得分:0)

感谢你们俩提供了非常有用的信息。解决方案实际上是两者的结合。

首先,如Walter所建议,我修改了resize.sh中的read命令以从命名管道中获取输入,然后我编写了一个新的“包装器”脚本,该脚本在后台执行resize.sh,并且由于Barmar指出了我需要一个gui窗口,它会启动一个很小的终端窗口,该窗口运行读取并将输入传递给命名管道。此外,使用wmctrl,我设法将小终端窗口放置在当前活动窗口开始的位置,并将其隐藏在下面(由于openbox每个应用程序的属性),因此从技术上讲它根本不可见:)

按照我的喜好,它确实太笨拙,但这确实是我目前唯一能想到的选择,因此,在找到更好的方法之前,这可以完成工作。 再次感谢你们俩指导我寻求解决方案,我真的很感激,加油:)