Shell 脚本:将输入发送到后台进程

Shell 脚本:将输入发送到后台进程

我正在使用以下脚本来监视文件夹,如果大小发生变化并且文件不存在,它将运行脚本。

#!/usr/bin/sh
SCRIPT="dim_import/xdir"

while true;
do
    size=$(du -s dim_import | cut -b 1-2)
    if [ $size -gt 32 ]; then
        if [ ! -f files ]; then
          $SCRIPT
        fi
    fi
    sleep 2
done

我像这样运行脚本

>watcher &

问题是在观察程序中运行的脚本需要输入。它会回显提示符,但输入不会发送到该脚本,而是发送到当前的 shell。因此,如果我输入 1234 我会得到:

sh: 1234:  not found.

如何确保将输入发送到正确的位置?

我尝试了很多不同的方法,但由于我这样做的独特方式,似乎没有一个有效。我也愿意接受更好的方法/解决方法。该脚本还能够处理我想要作为参数发送的输入。

编辑:我正在尝试发送类似 62918 的号码

编辑:我也可以做这样的事情,但我得到同样的错误:

    SCRIPT="dim_import/xdir"

    while true;
    do
        size=$(du -s dim_import | cut -b 1-2)
        if [ $size -gt 32 ]; then
            if [ ! -f files ]; then
              echo "SR Number: "; read srNum
              $SCRIPT $srNum
            fi
        fi
        sleep 2
    done

笔记:我没有使用 Bash。我正在使用Sh。

答案1

好吧,真正的问题是您实际想要发送到脚本的输入是什么。如果您希望它有空输入,请运行:

$SCRIPT < /dev/null

如果你想给它一些特定的输入,比如 $size 的内容,那么运行:

echo "$size" | $SCRIPT

如果您想键入输入,则必须将其放回前台以键入输入,然后再次将其放入后台。执行此操作的能力取决于您的 shell 是否具有作业控制(大多数都有,但原始的 Bourne shell 没有)。一定要这样做:

  • 运行fg %watcherfg %1(使用运行后看到的任何作业号jobs -l)将进程置于前台。
  • 键入您想要的输入,然后按回车键。
  • 键入 control-Z 将其放回后台(或使用stty -a并检查来susp查看停止字符是什么)。
  • bg %1通过 control-Z 停止程序后,用(或任何数字)将其放回后台。

另一个答案是使用命名管道。这是一个示例(用于tr代替您的脚本只是为了展示):

$ mkfifo my_fifo
$ tr a-z A-Z < my_fifo &
$ exec 6> my_fifo
$ echo here is some input for the fifo >&6
$ HERE IS SOME INPUT FOR THE FIFO

首先,您运行脚本,获取来自 fifo 的输入(首先运行脚本很重要)。然后exec 6> ...将 shell 的文件描述符 6 写入 fifo。然后,每当您想要发送输出时,将其写入文件描述符 6(通过>&6)。请注意,最后的“HERE IS...”不是我输入的,它只是 tr 的输出。

答案2

通过大量研究,我确定在限制条件下这是不可能的。然而,我发现了一个不太理想的解决方法。

基本上我创建了一个命名管道(称为“.in”)并向其发送信息。我创建了一个函数,以便我只需执行其类型“i [输入]”

SCRIPT=".dim_import/xdir"

while true;
do
    size=$(du -s .dim_import | cut -b 1-2)
    if [ $size -gt 32 ]; then
        if [ ! -f ~/files ]; then
          echo "SR Number (i [number]): "; 
          read srNum < ~/.in
          $SCRIPT $srNum
          sleep 10
          ~/scripts/listSR
        fi
    fi
    if [ ~/ ]
    sleep 5
done

简介功能:

function i
{
  set +u
  echo $1 > ~/.in
  set -u
}

相关内容