【问题标题】:Unix command failing but still returning status 0Unix 命令失败但仍返回状态 0
【发布时间】:2016-11-29 13:19:03
【问题描述】:
unzip /test_data/sample.ZIP -d /data/Traget/
if [ "$?" = 1 ]; then
    echo " Unzipping of files failed"
    exit 1
fi

脚本正在归档数据并尝试在提到的位置写入,但目录 /data/Traget/ 无权写入,因此脚本失败......但它没有抛出状态 1。 有人可以帮忙吗

谢谢

【问题讨论】:

  • 你检查过它实际返回的状态吗?成功时通常返回 0,但失败时返回不同的代码。也许您的解压缩命令返回 2 或 3 ?

标签: shell unix


【解决方案1】:

比这简单得多:

set -e
set -o pipefail

unzip /test_data/sample.ZIP -d /data/Target/

您编写的所有 Bash 脚本都应该从这两个选项开始。他们所做的是在任何单个命令失败时以错误终止脚本。

这与 VBA 中可恶的“On Error Resume Next”相反,如果有人记得的话!

但如果你真的需要到处编写繁琐的错误处理代码,你会这样做:

if ! unzip /test_data/sample.ZIP -d /data/Traget/; then
    echo " Unzipping of files failed"
    exit 1
fi

【讨论】:

    【解决方案2】:

    你应该颠倒你的逻辑。 unzip 成功时返回 0,出错时返回任意数量的退出代码。就这样吧:

    unzip /test_data/sample.ZIP -d /data/Traget/
    if [ "$?" -ne 0 ]; then
        echo " Unzipping of files failed"
        exit 1
    fi
    

    您也可以通过运行轻松检查 unzip 返回的内容 echo $? 在你想知道退出状态的命令之后。

    当我运行类似的命令时会发生以下情况:

    $ unzip dd.zip  -d /tmp/a/b/
    Archive:  dd.zip
    error:  cannot create /tmp/a/b/filename
            Permission denied
    $ echo $?
    50
    

    所以 unzip 在以这种方式失败时返回 50。

    【讨论】:

      猜你喜欢
      • 2021-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-24
      • 2014-10-19
      • 2010-11-12
      相关资源
      最近更新 更多