【问题标题】:How to return exit code 0 from a failed command如何从失败的命令返回退出代码 0
【发布时间】:2016-03-21 11:52:18
【问题描述】:

我想从失败的命令中返回退出代码“0”。有没有更简单的方法来做到这一点,而不是:

function a() {
  ls aaaaa 2>&1;
}

if ! $(a); then
  return 0
else
  return 5
fi

【问题讨论】:

  • return ! a怎么样
  • 无需命令替换简单使用if ! a; then ...
  • 如果将stderr 输出写入stdout,在命令失败的情况下,脚本将抛出一个令人讨厌的错误,可以通过使命令输出静默并仅获取命令执行来避免该错误来自$?的状态
  • 如果我理解你的话,你想退出状态“OK”,如果ls命令失败,退出状态5(顺便说一句,你为什么写return而不是exit ?),如果ls 命令成功。那么,为什么需要ls?查询aaaaa 的存在不是更简单(也更容易理解)吗,例如[[ -e aaaaa ]] && echo 'ERROR: aaaaa exists!' && exit 5 之类的东西?
  • @dev-null 必须使用 cmd subst 由于 -e 并耦合其他开关

标签: linux bash shell unix


【解决方案1】:

只需将return 0 附加到函数即可强制函数始终成功退出。

function a() {
  ls aaaaa 2>&1
  return 0
}

a
echo $? # prints 0

如果您出于任何原因希望内联,您可以将|| true 附加到命令中:

ls aaaaa 2>&1 || true
echo $? # prints 0

如果您想反转退出状态,只需在命令前添加!

! ls aaaaa 2>&1
echo $? # prints 0

! ls /etc/resolv.conf 2>&1
echo $? # prints 1

此外,如果您说明您想要实现的总体目标,我们或许能够指导您找到更好的答案。

【讨论】:

  • 如果文件不存在 ls /etc/resolv.conf 2>&1 将在控制台中抛出一个丑陋的错误:)
  • 会的。可以通过将2>&1 替换为&>/dev/null 来完全抑制输出,或者只能通过将其替换为2>/dev/null 来抑制stderr。
猜你喜欢
  • 2022-01-20
  • 1970-01-01
  • 2021-09-24
  • 2018-12-11
  • 1970-01-01
  • 2015-03-02
  • 1970-01-01
  • 1970-01-01
  • 2020-10-28
相关资源
最近更新 更多