1

背景

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

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

问题是如果操作系统命令失败,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. 的2>&1建议, 在每个 cp 命令的末尾附加 ,以便将 stderr 重定向到 stdout,但我得到了这个:

Enter value for 1:

更新 2

SET DEFINE OFF使其不提示输入值。它让我发现不仅 stderr 没有被假脱机:stdout 也没有。似乎一切都用“!”执行 是不可假脱机的

4

3 回答 3

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 命令sql.out的输出、echo 的输出host.out和错误消息host.err。如果您以非交互方式启动脚本 - 从 cron 或其他东西 - 您必须像执行任何其他非 sql*plus 脚本一样捕获 stdout/stderr。

编辑有关评论

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

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

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

您仍然会在假脱机文件中仅获得 sql 的输出。

于 2013-08-07T20:24:58.437 回答
1

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

于 2013-08-07T11:50:12.253 回答
0

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

假脱机输出.log

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

阀芯关闭

主机ps -eaf | grep 某事 1>>out.log

SPOOL out.log 追加

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

于 2014-04-03T02:32:14.943 回答