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

carvr3hs  于 6个月前  发布在  Shell
关注(0)|答案(1)|浏览(90)

我有一个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,就好像它成功了一样。
注意:AFAIK写入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())

icnyk63a

icnyk63a1#

$?是非常不稳定的:当你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

字符串

相关问题