为什么我的shell脚本失败时却注册成功退出?

问题描述 投票:0回答:1

我有一个 shell 脚本,它对网络设备上目录中的所有文件执行 whisper,然后将结果记录存储在同一卷上。有时,网络发生问题(卷断开连接),导致结果记录的保存失败。这是典型的此类错误消息:

Traceback (most recent call last):
  File "/Users/db/Library/Python/3.11/bin/whisper", line 8, in <module>
    sys.exit(cli())
             ^^^^^
  File "/Users/db/Library/Python/3.11/lib/python/site-packages/whisper/transcribe.py", line 413, in cli
    os.makedirs(output_dir, exist_ok=True)
  File "<frozen os>", line 225, in makedirs
FileNotFoundError: [Errno 2] No such file or directory: '.'

我的脚本的相关部分如下所示:

    whisper "$file" --model large >> log
    if [[ $? -eq 0 ]]; then
        echo "exit success: $?"
        echo "*****success****** $?, `uname -n`, $me"  >> "${directory}/../${transdir}/${name}.txt"
    else
        echo "exit error: $?"
        echo "*****error****** $?, `uname -n`, $me"  >> "${directory}/../${transdir}/${name}.txt"       
    fi

通常,当脚本成功完成时,它会按预期输入第一个 if ,但即使我收到类似上面的错误消息,它仍然会输入第一个

if
,就好像它成功了一样。这是为什么?

注意:据我所知,写入

log
不是问题。


更新:

% whisper --bad_args; echo $?
whisper: error: the following arguments are required: audio
2

更新2:

#!/opt/local/Library/Frameworks/Python.framework/Versions/3.11/bin/python3.11
# -*- coding: utf-8 -*-
import re
import sys
from whisper.transcribe import cli
if __name__ == '__main__':
    sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
    sys.exit(cli())
python bash shell exit-code
1个回答
0
投票

$?
的波动性很大:在您
echo $?
的那一刻,
$?
的值就被
echo
的退出状态取代,不再指
whisper
的退出状态。因此,如果您可能多次需要它,您应该在使用它之前将其存储在变量中。

if whisper "$file" --model large >> log; then
    echo "*****success****** $?, `uname -n`, $me"  >> "${directory}/../${transdir}/${name}.txt"
else
    whisper_rc=$?                    # <- THIS RIGHT HERE
    echo "exit error: $whisper_rc"
    echo "*****error****** $whisper_rc, `uname -n`, $me"  >> "${directory}/../${transdir}/${name}.txt"       
fi
© www.soinside.com 2019 - 2024. All rights reserved.