gpt4 book ai didi

bash - 在 bash 中,要么退出脚本而不退出 shell,要么从子 shell 中导出/设置变量

转载 作者:行者123 更新时间:2023-12-04 09:03:31 26 4
gpt4 key购买 nike

我有一个运行一组脚本的函数,这些脚本在当前 shell 中设置变量、函数和别名。

reloadVariablesFromScript() {
for script in "${scripts[@]}"; do
. "$script"
done
}
如果其中一个脚本有错误,我想退出脚本然后退出函数,而不是杀死shell。
reloadVariablesFromScript() {
for script in "${scripts[@]}"; do
{(
set -e
. "$script"
)}
if [[ $? -ne 0 ]]; then
>&2 echo $script failed. Skipping remaining scripts.
return 1
fi
done
}
这会做我想要的,除了它不会在脚本中设置变量,无论脚本是成功还是失败。
没有子 shell , set -e导致整个shell退出,这是不可取的。
有没有一种方法可以防止被调用的脚本在不终止 shell 的情况下继续出错,或者从子 shell 中设置/导出变量、别名和函数?
以下脚本模拟了我的问题:
test() {
{(
set -e

export foo=bar
false
echo Should not have gotten here!
export bar=baz
)}

local errorCode=$?

echo foo="'$foo'". It should equal 'bar'.
echo bar="'$bar'". It should not be set.

if [[ $errorCode -ne 0 ]]; then
echo Script failed correctly. Exiting function.
return 1
fi

echo Should not have gotten here!
}

test
如果更糟,因为这些脚本实际上并不编辑文件系统,我可以在子shell 中运行每个脚本,检查退出代码,如果成功,则在子shell 之外运行它。

最佳答案

请注意 set -e has a number of surprising behaviors - 依赖它并不是普遍认为的好主意。不过,需要注意的是:我们可以将环境变量、别名和 shell 函数作为文本进行混洗:

envTest() {
local errorCode newVars
newVars=$(
set -e

{
export foo=bar
false
echo Should not have gotten here!
export bar=baz
} >&2

# print generate code which, when eval'd, recreates our functions and variables
declare -p | egrep -v '^declare -[^[:space:]]*r'
declare -f
alias -p
); errorCode=$?
if (( errorCode == 0 )); then
eval "$newVars"
fi

printf 'foo=%q. It should equal %q\n' "$foo" "bar"
printf 'bar=%q. It should not be set.\n' "$bar"

if [[ $errorCode -ne 0 ]]; then
echo 'Script failed correctly. Exiting function.'
return 1
fi

echo 'Should not have gotten here!'
}

envTest
请注意,此代码仅计算 export如果整个脚本段成功;问题文本和评论似乎表明如果不需要,这是可以接受的。

关于bash - 在 bash 中,要么退出脚本而不退出 shell,要么从子 shell 中导出/设置变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63510588/

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