返回退出代码而不终止调用者的终端?

返回退出代码而不终止调用者的终端?

我很难从脚本中获取返回值。给我带来麻烦的脚本是second.sh以下。但是存在与名为的脚本的交互first.sh,而这种相互作用似乎是麻烦的根源。

第一个脚本是测试脚本并驱动第二个脚本。它需要第二个脚本来设置交叉编译环境(因此是前导点的原因)。然后第一个脚本调用make设置了各种变量,例如CXXCXXFLAGS

# first.sh

. ./second.sh arg1
if [ "$?" -eq "0" ]; then
    make
    ...
fi

. ./second.sh arg2
if [ "$?" -eq "0" ]; then
    make
    ...
fi

. ./second.sh arg3
if [ "$?" -eq "0" ]; then
    make
    ...
fi

第二个脚本通常由用户独立运行,并且它非常复杂,因为它正在检测平台、架构和其他杂项功能。它设置各种变量,例如CXXCXXFLAGS被使用过make在第一个脚本中。

# second.sh
...

# if success, return 0
exit 0
...

# if failure, return non-0
exit 1

我遇到的问题是致电exitsecond.sh杀死终端,所以first.sh完全停在了轨道上。当用户单独运行它时,也会出现类似的问题。

当我尝试将第二个脚本更改为:

# second.sh
...

# if success, return 0
return 0

# else for failure, return non-0
return 1

然后,从first.sh看法,second.sh总是失败,即使return 0

如何在 Bash 下添加不会终止终端的返回码?


迄今为止,我一直在跑步没有第一个测试脚本,因此第二个脚本不需要返回成功/失败。但我正在尝试自动化测试,所以我真的需要能够获得返回码

答案1

一种可能不理想的方法是 do alias exit=return,然后它使second.sh退出 do 脚本返回,并使用给定的代码。这当然不会像那样切断函数的嵌套exit,但它应该适用于顶级exit调用。

您最终可能需要这样做unalias exit

答案2

问题的关键在于您正在获取(.)脚本,而不是简单地执行它们(./script2.sh/bin/bash script2.sh)。

如果您确实需要source它们,请在子 shell 中进行(. ./myscript2.sh args)

如果你可以执行通常情况下您可以将脚本存储在变量中,退出代码在每次执行后自动更新$?

./myscript2.sh arg1
FirstExitCode=$?
./myscript2.sh arg2
SecondExitCode=$?
 ...

阅读有关源的更多信息help .

答案3

根据哈斯塔关于采购的回答,这似乎是我在second.sh不杀死终端的情况下返回状态所需要的:

#!/usr/bin/env bash
...

# if success, return 0
[ "$0" = "$BASH_SOURCE" ] && exit 0 || return 0

# else for failure, return non-0
[ "$0" = "$BASH_SOURCE" ] && exit 1 || return 1

相关内容