我希望将一些 Oracle 组件包含在 Bash 脚本中,该脚本将执行一组目标:
- 以 root 身份登录远程服务器(我的 Oracle 数据库所在的位置)。
- 执行“su - oracle”。
- 以特定 Oracle 用户身份登录 sqlplus 环境。
- 执行 SQL 选择命令并将该命令的输出存储到变量中。
- 在 Bash shell 中显示该变量的结果。
我在 stackoverflow 上浏览了几个示例,其中许多示例似乎都在执行命令,但不一定详细说明如何向用户显示输出(尽管我仍在检查更多示例)。例如,假设所有 key 交换均已预先设置,则可以使用以下方法:
#!/bin/sh
ssh -q <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="7705181803374259415940594f" rel="noreferrer noopener nofollow">[email protected]</a>
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 <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="4a3825253e0a7f647c647d6472" rel="noreferrer noopener nofollow">[email protected]</a> "su - oracle"
Warning: no access to tty (Bad file descriptor).
Thus no job control in this shell.
如果我执行以下操作,我实际上可以成功进入 sqlplus 环境,没有任何问题:
ssh -q <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="483a27273c087d667e667f6670" rel="noreferrer noopener nofollow">[email protected]</a> "su - oracle -c 'sqlplus ABC/XYZ@core'"
SQL*Plus: Release 9.2.0.4.0 - Production on Tue May 29 12:35:06 2012
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production With the Partitioning, Real Application Clusters, OLAP, Data Mining and Real Application Testing options
SQL>
如果我理解为什么会出现上述问题,我可能就能弄清楚如何让我的脚本正常工作。任何建议将不胜感激!谢谢。
最佳答案
将第一行更改为:
ssh -t <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="8cfee3e3f8ccb9a2baa2bba2b4" rel="noreferrer noopener nofollow">[email protected]</a> "su - oracle"
获取一个 tty 来看看这是否适合您。
你可以在脚本中做的另一件事是将 stderr 重定向到你的变量,如果你想在你的变量中看到它,这对你来说似乎不是这样,尽管我已经这样做了在某些情况下是过去的。下面的评论中有一个示例。
关于sql - 如何在 Bash 脚本中运行 SQL 命令并将该命令的输出保存到变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10805433/