shell进程没有退出`$()`里面的`exit`

时间:2015-06-06 19:37:36

标签: bash shell

我有一个复杂的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

我该怎么做才能真正退出?

更新

如果有人有更好的建议,请说出来!

3 个答案:

答案 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)