繁体   English   中英

执行脚本后获取的退出状态不正确

[英]Incorrect exit status being fetched after executing a script

我有 2 个脚本。 我正在从另一个脚本调用一个脚本来捕获退出状态。

导入.sh

    SCHEMA=$1
    DBNAME=$2
    LOGPATH=/app/dbimport/PreImport_`date +%d%b%Y`.log
    export ORACLE_HOME=/oracle/product/11.2.0/db
    set -x
    for line in `cat "$SCHEMA" | egrep -w 'PANV|PANVPXE'`
    do
            USER=`echo "$line" |cut -d ';' -f1`
            echo "Fetching User : $USER" >> "$LOGPATH"
            PASSWORD=`echo "$line" | cut -d ';' -f2`
            echo "Fetching Password: $PASSWORD" >> "$LOGPATH"
            SOURCE=`echo "$line" | cut -d ';' -f3`
            echo "Fetching Source Schema : $SOURCE" >> "$LOGPATH"
    done
    exit $?

临时.sh

RC=`/app/arjun/scripts/Import.sh schema_remap_AANV02_UAT2.txt ARJSCHEMA`
echo "Return code = $RC"

schema_remap_AANV02_UAT2.txt

AANVPXE;Arju4578;PANVPXE
AANVSL;Arj0098;PANVSL
AANV;Arju1345;PANV

the.txt 文件没有读取权限(确保您没有授予读取权限),因此脚本应该通过将退出状态返回为 exit $? .

下面是我运行 temp.sh 后的 output

+ cat schema_remap_AANV02_UAT2.txt
+ egrep -w 'PANV|PANVPXE'
cat: schema_remap_AANV02_UAT2.txt: Permission denied
+ exit 1
Return code =

内部脚本以 exit 1 退出(因为 cat 命令失败),但在 temp.sh 中,我在捕获返回代码时没有获得预期值。

我想确保无论哪个命令在 import.sh 中失败,脚本都应该以适当的退出状态返回。

要获取脚本Import.sh的退出代码而不是其 output,请将脚本temp.sh更改为

/app/arjun/scripts/Import.sh schema_remap_AANV02_UAT2.txt ARJSCHEMA
RC=$?
echo "Return code = $RC"

或者简单地

/app/arjun/scripts/Import.sh schema_remap_AANV02_UAT2.txt ARJSCHEMA
echo "Return code = $?"

请参阅注释以获取有关如何修复/改进脚本的提示。

我试图了解您将子脚本 ( Import ) 调用到父脚本 ( temp.sh ) 的方式。 好吧,让我告诉你发生了什么

导入脚本

SCHEMA=$1
DBNAME=$2
LOGPATH=/app/dbimport/PreImport_`date +%d%b%Y`.log
export ORACLE_HOME=/oracle/product/11.2.0/db
set -x
for line in `cat "$SCHEMA" | egrep -w 'PANV|PANVPXE'`
do
        USER=`echo "$line" |cut -d ';' -f1`
        echo "Fetching User : $USER" >> "$LOGPATH"
        PASSWORD=`echo "$line" | cut -d ';' -f2`
        echo "Fetching Password: $PASSWORD" >> "$LOGPATH"
        SOURCE=`echo "$line" | cut -d ';' -f3`
        echo "Fetching Source Schema : $SOURCE" >> "$LOGPATH"
done
exit $?

当 grep 出现问题时,此脚本将以不同于 0 的内容退出,因此如果您要查找的模式不存在,它将失败。

$ echo "hello" | egrep -i "bye"
$ echo $?
1

然后你从其他程序运行这个脚本

启动器

RC=`/app/arjun/scripts/Import.sh schema_remap_AANV02_UAT2.txt ARJSCHEMA`
echo "Return code = $RC"

这就是您遇到问题的地方 您像调用 function 一样调用脚本并期待结果。 变量 RC 正在获取您的脚本发送到 STDOUT 的任何 output,没有别的。 RC 将始终为空,因为您的脚本不会向 STDOUT 发送任何内容。 因此,您必须了解从子程序获取结果与评估生成子程序的返回代码之间的区别。

让我用我自己的脚本向您展示我刚刚向您解释的内容的示例。 我有两个脚本:child.sh 只是一个 sqlplus 到 Oracle。父调用子的方式与您相同。

$ more child.sh
#/bin/bash

$ORACLE_HOME/bin/sqlplus -S "/ as sysdba" << eof
whenever sqlerror exit failure;
select * from dual ;
eof

if [[ $? -eq 0 ]];
then
   exit 0;
else
   exit 99;
fi
$ more parent.sh
#!/bin/bash

# run child

var=`/orabatch/ftpcpl/log/child.sh`

echo $var

$ ./child.sh

D
-
X

$ echo $?
0
$ ./parent.sh
D - X
$ echo $?
0

如您所见,我的父母正在获取子脚本发送到 STDOUT 的任何内容。 现在让我们在子脚本中强制出错,以验证我的父脚本是否仍在正常退出:

$ ./child.sh
select * from dual0
          *
ERROR at line 1:
ORA-00942: table or view does not exist

$ ./parent.sh 
ERROR at line 1:
ORA-00942: table or view does not exist
$ echo $? 
0 

可以看到,我操作的output是第一个报错,不过不是报错,而是报错output。我爸已经结束ok了,连你都能看到报错了。

我会重写脚本如下:

#/bin/bash
my_path=/app/arjun/scripts

$my_path/Import.sh schema_remap_AANV02_UAT2.txt ARJSCHEMA 
result=$?
if [ ${result} -ne 0 ]; 
then
    echo "error"
    exit 2;
fi

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM