我目前正在开发一个插件来在我的文本编辑器中编译 Oracle 代码。开发 SQL Developer 的人们最近添加了一个命令行版本sqlcl
。问题是,这是一个 Java 应用程序 -jvm
每次我需要进行编译时启动它 () 可能会很昂贵 - 一些报告称它需要大约 20 秒。
我看到的一个建议是使用命名管道,如果我手动这样做,似乎效果很好。
1号航站楼:
mkfifo sqlconsole
tail -f sqlconsole | /opt/sqlcl/bin/sql /nolog
2号航站楼:
echo "conn hr/[email protected]/xe" > sqlconsole
语句运行成功。
但是,这个问题是,在 2 号航站楼,我没有从 1 号航站楼(我想要的)获得任何输出。
..
我发现了这篇关于从命名管道读取输出的文章,但是即使这样,输出sqlcl
也不会被重定向(并且,在写这篇文章时,输入似乎已经损坏)
#!/bin/bash
#consolereader.sh
trap "rm -f sqlconsole" EXIT
if [[ ! -p sqlconsole ]]; then
echo "pipe does not exist" >&2
exit 1
fi
while true
do
if read line < sqlconsole; then
if [[ "$line" == 'quit' ]]; then
break
fi
echo $line
fi
done
1号航站楼:
mkfifo sqlconsole
tail -f sqlconsole | /opt/sqlcl/bin/sql /nolog
2号航站楼:
./consolereader.sh &
echo "conn hr/[email protected]/xe" > sqlconsole
有没有我可以采取的更好的方法 - 这样我就可以sqlcl
在后台运行,并且仍然可以在我发送命令的会话中获得输出?
..
编辑:尝试 Germar 的解决方案:
setUpPipes.sh(终端 1):
#!/bin/bash
rm -f sqlconsole
rm -f sqlconsole_out
mkfifo sqlconsole
mkfifo sqlconsole_out
tail -f sqlconsole | /opt/sqlcl/bin/sql /nolog | tee -a sqlconsole_out
compileOracle.sh(终端2):
#!/bin/bash
echo "begin.."
tail -f /home/trent/pipedemo/sqlconsole_out &
echo "about to run connection"
echo "conn hr/[email protected]/xe" > /home/trent/pipedemo/sqlconsole
echo "select * from dual" > /home/trent/pipedemo/sqlconsole
echo "disconnect" > /home/trent/pipedemo/sqlconsole
echo "finished"
exit 0