我想运行命令:
nc localhost 9998
然后我希望我的脚本监视文件,并在文件发生变化时将文件内容回显到此子进程。
我无法解决重定向计划。如何访问子进程的STDIN?
答案 0 :(得分:2)
怎么样
tail -f $file |nc localhost 9998
编辑:
既然你已经有了一个缓冲区,那么你可以试试这样的东西:
while [ 1 ]; do
# Your stuff here.
buf=yourfunctionhere
buffer=$buffer$buf
if [ ! -z $buffer ]; then
echo $buffer |nc localhost 9998
# Empty buffer on success.
if [ $? -eq 0 ]; then
buffer="";
fi
fi
done
答案 1 :(得分:1)
mkfifo X
some_program <X >output &
create_input >X
some_program
将阻止读取X,直到create_input
写入。
答案 2 :(得分:0)
我认为可以接受的两种解决方案:
1)使用coprocess,这样我们就可以通过COPROC [0/1]数组访问coprocess命令创建的进程的stdin和stdout。
2)我最终做的是将我的应用程序分成两个代码块,如下所示。第一个块写入stdout,然后通过管道传输到第二个块的stdin。当第二个代码块中存在netcat问题时,这为我提供了一种缓冲数据的简洁方法:
{ while true;
write to STDOUT; } |
{ while true
nc localhost 9998 }
(实际上,当netcat无法连接时,第二个命令提供磁盘缓冲,因此脚本要复杂得多,但是管道的使用提供了缓冲,以便在网络问题中断netcat时数据不会丢失)
答案 3 :(得分:0)
我找到了一个使用diff和一个简单的bash脚本的解决方案。
以下脚本在文件更改时执行cat $file > $namedpipe
。这是我制作的check-file.sh
脚本:
#!/bin/bash
file=$1
tmp=`mktemp`
cp "$file" "$tmp"
namedpipe=`mktemp`
rm -rf $namedpipe
mkfifo $namedpipe
function cleanup() {
echo "end of program"
rm -rf $tmp
rm -rf $namedpipe
exit 1;
}
trap cleanup SIGINT
tail -f $namedpipe 2> /dev/null | netcat localhost 9998 &
while true; do
diff=$(diff "$file" "$tmp")
if [ ! -z "$diff" ]; then
cat $file > $namedpipe
cp $file $tmp
fi
sleep 1
done
此脚本将文件名称作为输入。例如,在您的环境中尝试这些命令(白色netcat -l 9998
正在运行):
touch /tmp/test
bash check-file.sh /tmp/test &
echo "change 1" > /tmp/test
sleep 1
echo "change 2" > /tmp/test
sleep 1
echo "change 3" > /tmp/test
注意:陷阱会清除临时文件,因此您可以优雅地中断此脚本。