如何在IBM i的BASH脚本中捕获CL程序的执行结果到变量?
解决IBM i中BASH调用CL程序捕获执行结果的方案
核心问题说明
你之前的两种方案失败的原因:
- CL程序的变量与BASH脚本属于不同进程空间,无法直接共享;
- CL本身没有
echo命令,直接调用会被识别为无效指令,必须通过QSH中转输出。
以下是两种经过验证的可行方案:
方案1:CL输出结果到标准输出,BASH捕获内容
让CL程序通过QSH将执行结果输出到标准输出,BASH用$()捕获输出内容,同时通过$?获取执行状态码。
CL程序示例(CPYIFSTOLIB.CL)
PGM PARM(&IFSPATH &LIB &FILE) DCL VAR(&IFSPATH) TYPE(*CHAR) LEN(256) DCL VAR(&LIB) TYPE(*CHAR) LEN(10) DCL VAR(&FILE) TYPE(*CHAR) LEN(10) DCL VAR(&RC) TYPE(*INT) LEN(5) VALUE(0) DCL VAR(&MSGID) TYPE(*CHAR) LEN(7) DCL VAR(&MSGDTA) TYPE(*CHAR) LEN(100) /* 执行IFS到库的复制操作 */ CPYFRMSTMF FROMSTMF(&IFSPATH) TOMBR('/QSYS.LIB/&LIB..LIB/&FILE..FILE') MBROPT(*REPLACE) MONMSG MSGID(CPF0000) EXEC(DO) CHGVAR VAR(&RC) VALUE(1) RCVMSG MSGID(&MSGID) MSGDTA(&MSGDTA) /* 通过QSH输出错误信息到stdout */ CALL PGM(QSH) PARM('echo "复制失败:' *CAT &MSGID *CAT ' - ' *CAT &MSGDTA *CAT '"') RETURN RC(&RC) ENDDO /* 复制成功时输出信息 */ CALL PGM(QSH) PARM('echo "复制成功:已将' *CAT &IFSPATH *CAT '同步到库' *CAT &LIB *CAT '中的文件' *CAT &FILE *CAT '"') RETURN RC(&RC) ENDPGM
BASH脚本调用示例
#!/usr/bin/bash # 定义复制参数 IFS_SOURCE="/home/user/source_data.txt" TARGET_LIB="MYTESTLIB" TARGET_FILE="MYSOURCEFILE" # 调用CL程序并捕获输出结果 COPY_RESULT=$(system "CALL PGM(MYTESTLIB/CPYIFSTOLIB) PARM('$IFS_SOURCE' '$TARGET_LIB' '$TARGET_FILE')") # 根据状态码执行后续逻辑 if [[ $? -eq 0 ]]; then echo "业务执行:$COPY_RESULT" # 这里写入复制成功后的业务逻辑,比如更新日志、触发后续任务 else echo "错误处理:$COPY_RESULT" # 这里写入复制失败后的处理逻辑,比如告警、回滚操作 fi
方案2:CL返回状态码,BASH捕获状态并按需读取详细信息
如果只需要判断成功/失败,可通过CL的返回码传递状态;若需要详细错误信息,可将错误内容写入IFS临时文件,BASH读取后清理。
CL程序示例
PGM PARM(&IFSPATH &LIB &FILE) DCL VAR(&IFSPATH) TYPE(*CHAR) LEN(256) DCL VAR(&LIB) TYPE(*CHAR) LEN(10) DCL VAR(&FILE) TYPE(*CHAR) LEN(10) DCL VAR(&RC) TYPE(*INT) LEN(5) VALUE(0) DCL VAR(&MSGID) TYPE(*CHAR) LEN(7) DCL VAR(&MSGDTA) TYPE(*CHAR) LEN(100) CPYFRMSTMF FROMSTMF(&IFSPATH) TOMBR('/QSYS.LIB/&LIB..LIB/&FILE..FILE') MBROPT(*REPLACE) MONMSG MSGID(CPF0000) EXEC(DO) CHGVAR VAR(&RC) VALUE(1) RCVMSG MSGID(&MSGID) MSGDTA(&MSGDTA) # 将错误信息写入IFS临时文件 CALL PGM(QSH) PARM('echo "错误ID:' *CAT &MSGID *CAT ',详情:' *CAT &MSGDTA *CAT '" > /tmp/copy_error.tmp') ENDDO RETURN RC(&RC) ENDPGM
BASH脚本调用示例
#!/usr/bin/bash IFS_SOURCE="/home/user/source_data.txt" TARGET_LIB="MYTESTLIB" TARGET_FILE="MYSOURCEFILE" # 调用CL程序 CALL PGM(MYTESTLIB/CPYIFSTOLIB) PARM('$IFS_SOURCE' '$TARGET_LIB' '$TARGET_FILE') # 获取CL返回的状态码 EXEC_RC=$? if [[ $EXEC_RC -eq 0 ]]; then echo "复制完成,启动后续业务流程..." # 成功业务逻辑 else # 读取临时文件中的错误信息 ERROR_DETAIL=$(cat /tmp/copy_error.tmp) echo "复制失败:$ERROR_DETAIL" # 清理临时文件 rm /tmp/copy_error.tmp # 错误处理逻辑 fi
内容的提问来源于stack exchange,提问作者Digvijay
相关产品推荐
相关产品推荐

