我正在处理备份脚本,但想将脚本错误停止,除了某些命令(例如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"
答案 0 :(得分:8)
如果主命令失败,则可以使用||
执行不会失败的操作,例如:
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
)处于活动状态,则退出。