Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何退出期望返回的bash函数_Bash_Return_Exit - Fatal编程技术网

如何退出期望返回的bash函数

如何退出期望返回的bash函数,bash,return,exit,Bash,Return,Exit,我不完全清楚在调用期望返回的函数和不期望返回的函数时,bash的exit关键字如何/为什么不一致 例如,在以下复制中: #!/bin/bash exitfunc() { echo "Flag 1" exit } exitfunc echo "We should never see this." 我们看到了输出: $ ./z.bash Flag 1 然而,在这一细微的修改中: #!/bin/bash exitfunc() { echo "Flag 1" exi

我不完全清楚在调用期望返回的函数和不期望返回的函数时,bash的exit关键字如何/为什么不一致

例如,在以下复制中:

#!/bin/bash
exitfunc()
{
  echo "Flag 1"
  exit
}
exitfunc
echo "We should never see this."
我们看到了输出:

$ ./z.bash 
Flag 1
然而,在这一细微的修改中:

#!/bin/bash
exitfunc()
{
      echo "Flag 1"
      exit
}
foo=exitfunc
echo "We should never see this."
输出表明函数显然没有退出shell

$ ./z.bash
We should never see this.
第二个版本中的
标志1
似乎是存储在foo中的值,可能用于存储错误代码。我的问题是,
exit
为什么在以这种方式调用的函数中有这种行为?当函数期望返回时,它是否打开一个新的shell?如何正确退出这些功能之一?我是否只需要检查
foo
的输出值,并将
exit
捕获器一直包含到调用堆栈的上层


谢谢。

当您执行
foo=exitfunc
时,您正在为变量
foo
分配字符串
exitfunc
,而不是执行函数。为了执行该函数,您应该改为执行
foo=$(exitfunc)
。然后变量
foo
将包含函数“Flag 1”的输出。这称为命令替换

调用
exit
将终止在其中执行函数的子shell,而不是从中调用函数的shell。要退出主机外壳程序,可以执行以下操作:

#!/bin/bash
exitfunc()
{
      echo "Flag 1"
      exit 1
}
foo=$(exitfunc) || exit
echo "We never see this."
#!/bin/bash
exitfunc()
{
      echo "Flag 1"
      exit 1
}
foo=$(exitfunc)
e=$?
echo "$foo"
if [ $e -ne 0 ]; then exit; fi
echo "We never see this."
退出状态为非零,因此主机外壳在最后一行之前退出

函数的返回代码存储在变量
$?
中,因此如果要在退出前使用
$foo
,可以执行以下操作:

#!/bin/bash
exitfunc()
{
      echo "Flag 1"
      exit 1
}
foo=$(exitfunc) || exit
echo "We never see this."
#!/bin/bash
exitfunc()
{
      echo "Flag 1"
      exit 1
}
foo=$(exitfunc)
e=$?
echo "$foo"
if [ $e -ne 0 ]; then exit; fi
echo "We never see this."
输出:

Flag 1
当你打电话时:

foo=$(exitfunc)
或者老式的:

foo=`exitfunc`
由于命令替换,函数
exitfunc
在分叉的子shell中执行,因此
exit
只终止子shell或子shell,而不是当前shell。因此,将打印
echo
赋值后的
echo
语句,因为此echo在当前shell中执行