我有一个很长的 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:
SET DEFINE OFF
使其无法提示输入值。它让我发现不仅stderr没有被假脱机:stdout也没有。似乎用“!”执行的所有内容是不能脱机的。
答案 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的东西......