3

我和一些开发人员正在使用 KornShell (ksh) 在 Linux 环境中运行 SAS 程序。该脚本调用 SAS 命令行,我希望从 SAS 执行中收集标准输出(由 SAS 定义和编写的字符串)以及 Linux 返回代码(0/1)。

我的代码(将标准输出收集到 envar,但 return_code 始终为 0,因为 envar 分配成功):

envar=$(./sas XXXX/filename.sas -log $LOG_FILE)

return_code=$?

有没有一种方法可以同时收集返回码和标准输出,而无需两次提交此命令?

4

1 回答 1

1

当 SAS 作为非交互式进程运行时,它不会向 STDOUT 写入任何内容。日志文件包含执行语句的记录和步骤统计;“打印”输出(例如 from proc print)被写入“列表”文件。默认情况下,将使用附加“.lst”的源文件的名称(在您的情况下为filename.lst)创建该文件。

您正在使用-log系统选项提供一个文件来接受日志输出。定义列表文件的相关选项是-print选项。当然,如果程序不创建任何列表输出,则不需要这样的选项。

正如您所发现的,返回的值$?是 SAS 的执行返回码。任何非零值都表示程序执行期间发生了某种错误。

如果你想影响返回码,你可以ABORT在你的 SAS 程序中使用 data step 语句。这将立即停止 SAS 程序,因为将返回代码设置为对您有意义的内容。例如,假设您想在特定PROC SQL步骤失败时终止进一步的处理:

data _null_;
   rc = symgetn('SQLRC');
   put rc=;
   if rc > 0 then ABORT RETURN 10;
run;

这会将返回代码设置为10,您可以使用外部脚本向适当的人发送电子邮件。这样的自定义返回码值必须大于6小于976;其他值保留给 SAS。 这是 SAS 文档链接

于 2013-04-04T00:05:35.093 回答