gpt4 book ai didi

bash - 使用 set -e(陷阱)在脚本中保存命令退出代码的最佳方法?

转载 作者:行者123 更新时间:2023-12-04 03:15:20 25 4
gpt4 key购买 nike

有没有更好/更好的方法来将特定命令的返回码保存在使用 set -e 的 bash 脚本中?

如您所知,在陷阱模式下脚本将退出,除非您使用管道并且管道命令成功。

#!/bin/bash
set -e
# a lot of code...
MY_RESULT=0
command-that-can-fail || MY_RESULT=$?
export MY_RESULT
# optionally
printf "MY_RESULT=${{MY_RESULT}}\n" >> env.property

背景:这主要与 CI/构建环境脚本有关,其中不使用 set -e 是不好的,因为它确实隐藏了错误,即使您有一些错误,脚本也会继续。

现在,上面代码的唯一问题是难看/难以阅读,而且在许多情况下,管道命令甚至在屏幕之外可见,人们对代码的工作方式感到困惑.

所以,问题是如何重写它以提高可读性。我们可以为 bash 带来一些美感吗?

最佳答案

您可以使用 '!'特殊字符以避免退出脚本,并将指令分组以取回返回值:

#! /bin/sh
set -e
mycmd()
{
if [ $1 -eq 1]; then
return 1
fi
return 0
}

err=0
! {
mycmd 0
err=$?
}
echo "err $err" # Err = 0

err=0
! {
mycmd 1
err=$?
}
echo "err $err" # Err = 1

如果您使用“exit”而不是“return”,请不要忘记使用子 shell 来调用您的命令:

mycmd()
{
if [ $1 -eq 1]; then
exit 1
fi
exit 0
}

err=0
! {
$(mycmd 1)
err=$?
}
echo "err $err" # Err = 1

关于bash - 使用 set -e(陷阱)在脚本中保存命令退出代码的最佳方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41566285/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com