如何在shell脚本中读取外部程序的输出和返回值?

时间:2014-10-01 19:43:47

标签: shell python-3.x return-value stdout stderr

我正在编写一个脚本来读取跟踪代码,查看将跟踪发布到网站的结果并打印一些消息并具有返回值。 这是python代码的一部分:

# update return True if there was a change to the .msg file
def update(cod):
    msg = extract_msg(cod)
    if msg == 'ERROR':
        print('ERROR: invalid code\n')
        sys.exit(2)
    file = open('.msg', "r+")
    old_msg = file.read()
    if msg == old_msg:
        return False 
    else:
        print('Previous message: ' + old_msg)
        print('Latest message: ' + msg)
        file = overwrite(file, msg)
        file.close()
        return True

def main(argv):
    if len(argv) > 1:
        cod_rastr = argv[1]
    else:
    print("Error: no arg, no code\n")
    return -1
    # Verify if file exists
    if os.path.isfile(".msg") == False:
        arq = open('.msg', 'w')
        arq.close()
    # post() returns the source code of the resulting page of the posted code.
    cod = post(cod_rastr)
    if update(cod) == False:
        return 0
    else:
        print ('\n Message!\n')
        return 1

在这里,我不仅要读取打印(对于最终用户),还要读取返回值(有条件使用)。这个脚本应该读取.py的输出并给我发一封电子邮件,以防上次检查有更新(我将把这个脚本放在crontab中):

#!/bin/bash
if [ -z "$1" ]; then 
    echo usage: $0 CODE
    exit
fi

CODE=$1
STATUS=$(myscript.py $CODE 2>&1)
VAL=$?
FILE=$(<.msg)
# always prints 0 (zero)
echo $VAL
# I want to check for an existing update case
if [[ $STATUS == 'Message!' ]]
then
    echo $STATUS
    echo $FILE | mail myuser@mydomain.com -s '$CODE: Tracking status'
fi

问题是$?总是返回0,而我在if中的字符串检查不起作用,因为我认为它也会读取update()打印,其中包含打印中的变量。 如何在不更改python脚本的情况下运行此shell脚本?

提前致谢。

1 个答案:

答案 0 :(得分:0)

我怀疑你可以用子进程模块做你想做的事。在将stdout定向到文件时使用rc = subprocess.call(...)来获取返回码,或者使用p = subprocess.Popen(...)然后使用p.communicate来获取输出并使用p.returncode来获取返回码。