如何解决是否可以使用“ set -e”但允许某些命令失败?
我正在处理备份脚本,但想将脚本错误停止,除了某些命令(例如veracrypt --mount
)已挂载后返回1的
#! /bin/sh
set -e
veracrypt --text --mount --pim 0 --keyfiles "" --protect-hidden no "/Volumes/Samsung BAR/.b" /Volumes/Backup
borg check /Volumes/Backup/Borg
veracrypt --text --dismount "$BACKUP_VOLUME_PATH"
解决方法
如果主命令失败,则可以使用||
执行不会失败的操作,例如:
blah || true
{ yada; yada; yada; } || true
在没有|| true
的情况下,脚本将抱怨错误然后停止。有了它,您仍然会看到错误,但是脚本会继续执行。
另一种可能性是利用以下事实:如果它是if
的一部分,则不视为失败:
if blah ; then true ; fi
即使blah
错误,脚本也会继续执行。
最后,您可以针对特定命令暂时将其关闭:
set +e ; blah ; set -e
仅当您已经知道当前设置时,此解决方案才真正可行。除非您在关闭-e
之前对其进行了设置,否则您可能不想打开它们。
要检测其当前设置并仅在事先已将其打开的情况下将其重新打开,可以使用:
# 1: State here can be either +e or -e. If -e,record that fact and make +e.
eWasSet=false; [[ $- = *e* ]] && eWasSet=true && set +e
# 2: Do stuff that needs +e.
blah blah blah
# 3: Revert state if needed. After this,it's as it was in comment 1 above.
${eWasSet} && set -e
之所以可行,是因为$-
包含所有当前的set
值(例如ehB
用于错误退出,哈希和括号扩展),因此您可以使用通配符等于运算符来查找如果某个特定设置(例如e
)处于活动状态,则退出。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。