此程序使用的是Informix4GL。其目的是删除该报告。实际上,它工作得很好,但问题是只有特定的用户可以删除报告的物理文件,这意味着管理员。其他用户可以删除数据库中的报表,但不能删除物理路径。所以我需要捕获语法命令rm -f中的错误。我尝试使用WHENEVER,但它不能捕获它。有人知道怎么做吗?以下是删除报表的代码:
DELETE FROM sysrpt
WHERE srpt_seq_no = p_sysrpt.srpt_seq_no
LET sel_rpt_id = ""
LET sel_rpt_id = p_sysrpt.srpt_pgm_id CLIPPED, ".",
p_sysrpt.srpt_seq_no USING "<<<<<<"
LET sel_rpt_id = sel_rpt_id CLIPPED
LET prt_comand = "\\rm -f ", rpt_path CLIPPED, sel_rpt_id CLIPPED
LET prt_comand = prt_comand CLIPPED
RUN prt_comand 发布于 2011-07-29 22:39:56
我认为除非您将stdout/stderr作为rm命令的一部分重定向到另一个文件,否则您将无法捕获完整的错误消息。通过使用RUN语句的RETURNING子句,您可以将外壳命令的返回代码返回到4gl程序中,例如,您可以在"RUN prt_command“之后添加以下内容:
RUN prt_comand RETURNING p_return_code从内存中,我相信你需要MOD 256的返回码。
发布于 2011-08-05 05:51:33
这听起来像是典型的X-Y problem,其中真正的问题是最初生成的报告的访问权限。
也许报表文件在生成后应该是chmod-ed,以允许其他人删除它,或者应用程序用户应该具有正确设置的umask。
发布于 2011-08-04 06:15:07
请注意,即使无法删除文件或文件不存在,rm -f也会返回成功。如果希望rm返回错误,就不能告诉它不要返回错误。
否则,建议使用:
RUN prt_command RETURNING p_retcode是正确的。如果p_retcode的值不为零,则该命令以某种方式失败。
下面复制的这行是多余的:
LET prt_comand = prt_comand CLIPPED如果prt_command是CHAR变量,则存储的结果将再次填充空白(所有CHAR变量都存储为填充完整长度)。如果prt_command是一个VARCHR变量,则带有裁剪的前一个赋值已删除尾随空格。
我不清楚为什么要在rm命令前使用反斜杠。你在避免使用别名吗?如果是这样的话,是时候去掉rm的别名了;从长远来看,它是致命的。学习如何正确使用raw命令。如果你在没有别名的情况下访问一台机器,你将得不到保护,并且你会滥用命令,而没有别名声称能提供的任何安全网络。
https://stackoverflow.com/questions/6868015
复制相似问题