shell 如何使用unzip -tqq返回错误代码1?

vcudknz3  于 2023-05-01  发布在  Shell
关注(0)|答案(1)|浏览(165)

我尝试使用if-else语句用bash脚本测试最后一次在文件夹中创建的zip存档。如果文件损坏,语句应该返回else语句的主体。对于未损坏的zip文件,退出代码为零,并且执行if语句的主体。如果我有一个损坏的zip文件,-qq选项不会像预期的那样返回非零错误代码。而是打印一个包含信息的字符串。

if $(ls -Art ~/*.zip | tail -n 1 | xargs unzip -tqq);then
    echo 'file is ok'
else 
    echo 'file is corrupt'
fi

我尝试过使用zip -Tunzip -tqqunzip -tq的其他方法。每次我得到的不是stderr的错误代码,而是stdin的消息:
“文件#1:错误的zipfile偏移量(本地头sig):0”
另外,我们的计划是将每个不为0的返回值转换为1,但这似乎不是一个优雅的方法。
您可以通过尝试损坏。压缩文件

dd if=/dev/zero of=<filename>.zip bs=1 count=1 seek=1 conv=notrunc

然后

unzip -tqq <filename>.zip

并产生错误消息。我不能让它以预期的方式工作。
为什么-qq不抑制所有人类可读的信息?

cnh2zyt3

cnh2zyt31#

如果是真的...我很怀疑听起来像是unzip里的bug话虽如此,如果你想让一个脚本在unzip打印某个东西时退出1,那么就像这样:

ls -Art ~/*.zip | tail -n 1 | while read F
do
   unzip -tqq $F | grep "some error I'm expecting" && exit 1
done

这假定错误进入标准输出。如果错误将转到stderr,则:

unzip -tqq $F 2>&1 | grep "some error I'm expecting" && exit 1

如果unzip返回失败,您可能希望它也退出错误:

if { unzip -tqq $F || exit 1; } 2>&1 | grep "some error I'm expecting" && exit 1

相关问题