是否可以使用“ set -e”但允许某些命令失败?

时间:2020-09-05 10:15:18

标签: bash sh zsh

我正在处理备份脚本,但想将脚本错误停止,除了某些命令(例如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"

1 个答案:

答案 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)处于活动状态,则退出。

相关问题