我很难从脚本中获取返回值。给我带来麻烦的脚本是second.sh
以下。但是存在与名为的脚本的交互first.sh
,而这种相互作用似乎是麻烦的根源。
第一个脚本是测试脚本并驱动第二个脚本。它需要第二个脚本来设置交叉编译环境(因此是前导点的原因)。然后第一个脚本调用make
设置了各种变量,例如CXX
和CXXFLAGS
。
# 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
第二个脚本通常由用户独立运行,并且它非常复杂,因为它正在检测平台、架构和其他杂项功能。它设置各种变量,例如CXX
和CXXFLAGS
被使用过make
在第一个脚本中。
# second.sh
...
# if success, return 0
exit 0
...
# if failure, return non-0
exit 1
我遇到的问题是致电exit
在second.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