【发布时间】:2011-04-09 16:08:42
【问题描述】:
我在 bash 脚本中使用“source”,如下所示:
#!/bin/bash
source someneatscriptthatendsprematurely.sh
我想退出 someneatscriptthatendsprematurely.sh 脚本,而不退出主脚本。
任何帮助表示赞赏!
【问题讨论】:
标签: bash subprocess return exit
我在 bash 脚本中使用“source”,如下所示:
#!/bin/bash
source someneatscriptthatendsprematurely.sh
我想退出 someneatscriptthatendsprematurely.sh 脚本,而不退出主脚本。
任何帮助表示赞赏!
【问题讨论】:
标签: bash subprocess return exit
您需要return 声明:
return [n]导致函数以
n指定的返回值退出。如果省略n,则返回状态为函数体中最后执行的命令的状态。如果在函数外部使用,但在.(源)命令执行脚本期间,它会导致 shell 停止执行该脚本并返回n或在脚本中执行的最后一个命令的退出状态为脚本的退出状态。如果在函数外部而不是在.执行脚本期间使用,则返回状态为假。任何与 RETURN 陷阱相关的命令都会在函数或脚本之后继续执行之前执行。
您可以通过以下两个脚本看到这一点:
script1.sh:
. script2.sh
echo hello again
script2.sh:
echo hello
return
echo goodbye
当您运行script1.sh 时,您会看到:
hello
hello again
【讨论】:
return 0。不这样做会导致父脚本出现不良行为。即[ -z "non-existant-file" ] && return 实际上会返回 1。
[ -z "non-existant-file" ] && return 0 将返回1。所以告诉人们明确地return 0 然后展示一个不起作用的例子是令人困惑的。
if、$? 或set -e)。无论如何,我很确定我所引用的引述在这种情况下清楚地表明了这种行为。
您可以更改环境变量是否重要?因为否则你可以通过在没有源代码的情况下执行脚本来执行它:
someneatscriptthatendsprematurely.sh
【讨论】:
我刚才也遇到了同样的问题
我意识到添加一个检查器函数并返回它不会也返回它的调用者的函数,例如。
关于 bash_functions
function install_packer_linux() {
check_wget && check_unzip
wget https://releases.hashicorp.com/packer/1.1.2/packer_1.1.2_linux_amd64.zip
unzip packer_1.1.2_linux_amd64.zip
mv packer ~/.local/bin
rm -f packer_1.1.2_linux_amd64.zip
}
function check_unzip() {
if ! [ -x "$(command -v unzip)" ]; then
echo "Error: unzip is not installed"
return 1
else
return 0
fi
}
function check_wget() {
if ! [ -x "$(command -v wget)" ]; then
echo "Error!: wget is not installed"
return 1
else
return 0
fi
}
$ source ~/.bash_functions
这里发生的事情是因为检查器是它返回的唯一位置,所以 install_packer_linux 仍将继续
所以你可以在这里做两件事。要么保持当前格式(函数调用另一个函数)原样并使用真值进行评估,然后如果值不是真值则返回,或者重写主 installer_packer_linux 函数上的检查器
真相:
function install_packer_linux() {
check_wget && check_unzip || return
wget https://releases.hashicorp.com/packer/1.1.2/packer_1.1.2_linux_amd64.zip
unzip packer_1.1.2_linux_amd64.zip
mv packer ~/.local/bin
rm -f packer_1.1.2_linux_amd64.zip
}
注意我们添加了||在检查后返回并使用 && 连接检查 所以如果不是两个检查都是真的,我们返回函数
【讨论】: