![Shell 脚本:将输入发送到后台进程](https://linux22.com/image/69222/Shell%20%E8%84%9A%E6%9C%AC%EF%BC%9A%E5%B0%86%E8%BE%93%E5%85%A5%E5%8F%91%E9%80%81%E5%88%B0%E5%90%8E%E5%8F%B0%E8%BF%9B%E7%A8%8B.png)
我正在使用以下脚本来监视文件夹,如果大小发生变化并且文件不存在,它将运行脚本。
#!/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 %watcher
或fg %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
}