如何安全地提前退出 bash 脚本?
How to safely exit early from a bash script?
我知道在 bash
脚本(例如 here)中有几个关于 exit
与 return
的问题。
关于这个主题,但与现有问题不同,我想知道是否有关于如何从 bash
安全地实施 "early return" 的 "best practice"脚本使得用户当前的 shell 如果他们获取脚本则不会退出。
this 等答案似乎基于“exit
”,但如果脚本是来源的,即 运行 带有“.
”(点 space) 前缀, 当前 shell 上下文中的脚本 运行s,在这种情况下 exit
语句具有退出效果当前 shell。我认为这是一个不受欢迎的结果,因为脚本不知道它是在子 shell 中被获取还是 运行 - 如果是前者,用户可能会意外地拥有他的 shell消失。如果调用者获取当前 shell 的早期 returns 是否有 way/best 实践?
例如这个脚本...
#! /usr/bin/bash
# f.sh
func()
{
return 42
}
func
retVal=$?
if [ "${retVal}" -ne 0 ]; then
exit "${retVal}"
# return ${retVal} # Can't do this; I get a "./f.sh: line 13: return: can only `return' from a function or sourced script"
fi
echo "don't wanna reach here"
...运行s 如果它是来自子 shell...
的 运行 而不会杀死我当前的 shell
> ./f.sh
>
...但如果它来自:
则杀死我当前的 shell
> . ./f.sh
我想到的一个想法是将代码嵌套在条件语句中,这样就没有明确的 exit
语句,但是我的 C
/C++
偏见让人想到了早期-returns 在美学上优于嵌套代码。还有其他真正的解决方案吗"early return"?
在不导致父 shell 终止的情况下退出脚本的最常见解决方案是先尝试 return
。如果失败则 exit
.
您的代码将如下所示:
#! /usr/bin/bash
# f.sh
func()
{
return 42
}
func
retVal=$?
if [ "${retVal}" -ne 0 ]; then
return ${retVal} 2>/dev/null # this will attempt to return
exit "${retVal}" # this will get executed if the above failed.
fi
echo "don't wanna reach here"
您也可以使用return ${retVal} 2>/dev/null || exit "${retVal}"
。
希望对您有所帮助。
我知道在 bash
脚本(例如 here)中有几个关于 exit
与 return
的问题。
关于这个主题,但与现有问题不同,我想知道是否有关于如何从 bash
安全地实施 "early return" 的 "best practice"脚本使得用户当前的 shell 如果他们获取脚本则不会退出。
this 等答案似乎基于“exit
”,但如果脚本是来源的,即 运行 带有“.
”(点 space) 前缀, 当前 shell 上下文中的脚本 运行s,在这种情况下 exit
语句具有退出效果当前 shell。我认为这是一个不受欢迎的结果,因为脚本不知道它是在子 shell 中被获取还是 运行 - 如果是前者,用户可能会意外地拥有他的 shell消失。如果调用者获取当前 shell 的早期 returns 是否有 way/best 实践?
例如这个脚本...
#! /usr/bin/bash
# f.sh
func()
{
return 42
}
func
retVal=$?
if [ "${retVal}" -ne 0 ]; then
exit "${retVal}"
# return ${retVal} # Can't do this; I get a "./f.sh: line 13: return: can only `return' from a function or sourced script"
fi
echo "don't wanna reach here"
...运行s 如果它是来自子 shell...
的 运行 而不会杀死我当前的 shell> ./f.sh
>
...但如果它来自:
则杀死我当前的 shell> . ./f.sh
我想到的一个想法是将代码嵌套在条件语句中,这样就没有明确的 exit
语句,但是我的 C
/C++
偏见让人想到了早期-returns 在美学上优于嵌套代码。还有其他真正的解决方案吗"early return"?
在不导致父 shell 终止的情况下退出脚本的最常见解决方案是先尝试 return
。如果失败则 exit
.
您的代码将如下所示:
#! /usr/bin/bash
# f.sh
func()
{
return 42
}
func
retVal=$?
if [ "${retVal}" -ne 0 ]; then
return ${retVal} 2>/dev/null # this will attempt to return
exit "${retVal}" # this will get executed if the above failed.
fi
echo "don't wanna reach here"
您也可以使用return ${retVal} 2>/dev/null || exit "${retVal}"
。
希望对您有所帮助。