我希望将一些 Oracle 组件包含在将执行一组目标的 Bash 脚本中:
- 以 root 身份登录到远程服务器(我的 Oracle DB 所在的位置)。
- 执行“su - oracle”。
- 以特定 Oracle 用户身份登录 sqlplus 环境。
- 执行 SQL 选择命令并将该命令的输出存储到变量中。
- 在 Bash shell 中显示该变量的结果。
我在 stackoverflow 上查看了几个示例,其中许多似乎都执行了命令,但不一定详细说明如何向用户显示输出(尽管我仍在检查更多)。例如,假设预先设置了所有密钥交换,则可以使用以下方法:
#!/bin/sh
ssh -q root@5.6.7.8
sqlplus ABC/XYZ@core <<ENDOFSQL
select CREATE_DATE from PREPAID_SUBSCRIBER where MSISDN='12345678912';
exit;
ENDOFSQL
相反,这是我尝试设置的方法:
#!/bin/sh
datasource_name=`echo "select CREATE_DATE from PREPAID_SUBSCRIBER where MSISDN='12345678912';" | ssh -q 5.6.7.8 "su - oracle -c 'sqlplus -S ABC/XYZ@core'" | tail -2 | head -1`
理想情况下,datasource_name 变量现在应该采用以下值:
no rows selected
或者如果表中有一个条目:
CREATE_DATE
-------------------
07-06-2009 18:04:48
tail 和 head 命令用于去除输出中的空行,而 ssh -q 和 sqlplus -S 选项用于忽略警告。
但是,当我运行该命令并执行以下操作时:
echo "${datasource_name}"
我得到...
警告:无法访问 tty(错误的文件描述符)。因此在这个 shell 中没有作业控制。
...而不是上面的两个输出之一。如果我理解正确,这可能是一个警告,取决于是否使用了特定的 shell,但大多数在线资源表明这可以忽略不计。这个警告的好处是,我上面的命令似乎实际上正在运行并将“某些东西”存储到 datasource_name 中,但这不是我想要的。
现在为了简化这个问题,我注意到当我简单地尝试从运行 bash 脚本的框中 su 到远程机器上的 oracle 时,我得到了相同的 tty 警告:
ssh root@5.6.7.8 "su - oracle"
Warning: no access to tty (Bad file descriptor).
Thus no job control in this shell.
如果我执行以下操作,我实际上可以毫无问题地成功进入 sqlplus 环境:
ssh -q root@5.6.7.8 "su - oracle -c 'sqlplus ABC/XYZ@core'"
SQL*Plus:发布 9.2.0.4.0 - 2012 年 5 月 29 日星期二 12:35:06 生产
版权所有 (c) 1982, 2002,甲骨文公司。版权所有。
连接到:Oracle 数据库 10g 企业版版本 10.2.0.4.0 - 64 位生产,具有分区、真正应用集群、OLAP、数据挖掘和真正应用测试选项
SQL>
如果我明白为什么会出现上述问题,我就有可能弄清楚如何让我的脚本正常工作。任何建议将不胜感激!谢谢你。