我有一个复杂的bash脚本,所以我把它分解为重要的代码:
MOD(x,y) is x - n.*y where n = floor(x./y) if y ~= 0. If y is not an
% integer and the quotient x./y is within roundoff error of an integer,
% then n is that integer. The inputs x and y must be real arrays of the
% same size, or real scalars.
这是关于我的脚本,我希望它打印#!/bin/sh
foo()
{
echo test
# here I do some work and if it fails I want to stop execution
exit 1
}
echo $(foo)
echo help
然后退出,但输出是:
test
test
help
也是如此。
我目前的临时解决方法是将bash
替换为exit 1
。
我该怎么做才能真正退出?
更新:
kill $$
不解决我的问题如果有人有更好的建议,请说出来!
答案 0 :(得分:4)
exit
内置命令导致当前正在执行的子shell终止。由于命令替换语法$(command)
创建了一个子shell来执行command
,因此exit
仅终止该子shell,而不是包含命令替换结果的shell。
如果您确实需要命令替换,那么您将无法从替换命令中捕获exit
。事实上,你甚至无法陷入失败。关于唯一的选择是将命令的输出发送到临时文件,然后在后续步骤中替换临时文件。
在OP的简单情况下,您只需直接拨打foo
而不是echo $(foo)
。但是,如果您需要在shell变量中捕获foo
的输出,例如,您可以按照以下方式执行此操作
foo() {
# ...
exit
}
foo >/tmp/foo
v=$(</tmp/foo)
答案 1 :(得分:1)
看起来你必须致电
foo
而不是echo $(foo)
答案 2 :(得分:1)
当您使用GL_VERSION
调用foo时,它会创建一个新的子shell ,这就是要退出的内容。您需要将$(foo)
替换为echo $(foo)