如何让OS命令的stderr以“!”运行去Sql *加线轴?

时间:2013-08-07 11:47:04

标签: shell sqlplus stderr spool

背景

我有一个很长的 Sql * plus 脚本,出于某种原因需要使用感叹号语法运行一些unix命令。

我写一个假脱机,以便在过程结束时有一个日志文件。

问题是如果OS命令失败, stderr 将丢失,并且不会转到假脱机文件。

示例代码

spool mylog.txt
!echo alter user xxx identified by yyyy;
alter user xxx identified by yyyy;
!echo cp file1 folder1/
!cp file1 folder1/
!echo alter user yyy identified by xxx;
alter user yyy identified by xxx;
!echo cp file2 folder2/
!cp file2 folder2/
spool off

如果一个cp失败,我只会通过查看mylog.txt来了解

显然做!cp file1 folder1/ &> mylog.txt只会弄乱以不可预测的方式假脱机的日志。

问题

为了将unix命令的stderr写入假脱机文件,可以做些什么呢?

更新

我尝试了lc.'s建议,在每个cp命令的末尾追加2>&1,以便将stderr重定向到stdout,但我得到了这个:

Enter value for 1:

更新2

SET DEFINE OFF使其无法提示输入值。它让我发现不仅stderr没有被假脱机:stdout也没有。似乎用“!”执行的所有内容是不能脱机的

3 个答案:

答案 0 :(得分:2)

实际上,stdout和stderr不会丢失,但它们不会进入假脱机文件。

给定脚本echo.sql

spool sql.out
select 1 from dual ;
!echo 1
!invalid command
spool off

如果您从shell启动脚本:

sqlplus *connect string*  @echo.sql > host.out 2> host.err

您将获得sql.out中sql命令的输出,host.out中echo的输出和host.err中的错误消息。如果您以非交互方式从cron或其他东西启动脚本,则必须像捕获任何其他非sql * plus脚本一样捕获stdout / stderr。

关于评论的

编辑

在脚本文件中使用选项SET TERMOUT ON,您将在假脱机文件和标准输出中输出sql命令。

最后,如果你想要一个文件中的所有内容,你可以这样调用你的脚本:

sqlplus *connect string*  @echo.sql &>echo.log

您仍然只能在假脱机文件中输出sql。

答案 1 :(得分:1)

您可以为每个命令附加2>&1以将stderr重定向到stdout。

答案 2 :(得分:0)

如果要将shell命令输出发送到sqlplus假脱机文件,则无法在SPOOL锁定文件进行写入时执行此操作。这是.sql脚本中对我有用的序列:

SPOOL out.log

...这里的sql东西......

SPOOL OFF

主持人ps -eaf | grep something 1>> out.log

SPOOL out.log APPEND

...更多sql的东西......