我使用的是使用bash源功能扩展的脚本;
#!/bin/bash
source someneatscriptthatendsprematurely.sh
我希望能够在不破坏主脚本的情况下从该脚本返回。
使用退出中断主脚本,返回仅在函数中有效,并且试验$(退出1)似乎也不起作用。
那么,是否可以在不破坏主bash的情况下返回子bash脚本?
任何帮助表示赞赏!
答案 0 :(得分:67)
您需要return
声明:
return [n]
使函数以
n
指定的返回值退出。如果省略n
,则返回状态是函数体中执行的最后一个命令的状态。如果在函数外部使用,但在.
(source)命令执行脚本期间,它会导致shell停止执行该脚本并返回n
或执行的最后一个命令的退出状态在脚本中作为脚本的退出状态。如果在函数外部使用而不是在.
执行脚本期间使用,则返回状态为false。在函数或脚本之后执行恢复之前,将执行与RETURN陷阱关联的任何命令。
您可以使用以下两个脚本查看此操作:
script1.sh:
. script2.sh
echo hello again
script2.sh:
echo hello
return
echo goodbye
当您运行script1.sh
时,您会看到:
hello
hello again
答案 1 :(得分:1)
您是否可以更改环境变量?否则你只需执行脚本就可以执行脚本:
someneatscriptthatendsprematurely.sh
答案 2 :(得分:0)
我刚才遇到同样的问题
我意识到添加一个checker函数并返回它也不会在其调用者身上返回该函数。
关于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仍将继续
所以你可以在这做两件事。保持当前格式(函数调用另一个函数),并使用truthy值进行评估,如果值不是真值则返回,或者在主installer_packer_linux函数上重写检查器
Truthy:
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
}
注意我们添加了||检查后返回,并使用&& amp; 因此,如果不是两个检查都是真实的,我们返回函数