ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

从函数返回后,bash脚本意外退出

2019-10-25 20:51:09  阅读:386  来源: 互联网

标签:bash shell execution stdout linux


这是我对堆栈溢出last question跟进的问题.
我将脚本缩减为必要的部分,但是如果是.认为,了解脚本的功能可能会有所帮助,您可以调查另一个问题.

 #!/usr/bin/env bash
 set -eu -o pipefail

 declare -a framelist


 #Print all results

 function output_values() {
   echo "Results!";
 }

 #parsing information from stdin

 function parser () {

   while read tc;
     do

      if [ -z "$tc" ]; then
        continue
      fi

      #Evaluation and saving result to array

      echo $result_value;

      framelist+=($result_value);

      if (( <<some abort condition>> )); then
        exec 0>&-
        echo "Last result: $result_value";
        return 0
      fi

     done
 }

 some_command_writing_to_stdout | parser $2;
 output_values;

该脚本执行命令和管道输出到我的本地函数,最后在线路回声返回结果“最后的结果是:$result_value”;如预期的那样.此后,它将终止提供此功能中解析的数据的命令-这也起作用.

我认为,当返回return 0时,脚本的下一行(命令的右下方)为output_values;应该执行,但不是.

即使我回声线,打印的结果解析器函数之前直接调用output_values功能,它不被执行.

因为我可以注释掉exec 0>&-,而且它的行为都一样,所以它变得更加不可思议.一旦退出解析器功能,即使是应由该行终止的命令也将终止.

我有什么改变能够与我的解析器函数的结果上下工夫,它返回后?这不是预期的行为.

问候

曼努埃尔

解决方法:

让我们来看看man bash,关于pipefail的部分:

pipefail

If set, the return value of a pipeline is the value of the last (rightmost) command to exit with a non-zero status, or zero if all commands in the pipeline exit successfully. This option is disabled by default.

与set -e结合使用,当命令(管道)以非零退出状态退出时,set -e将退出,唯一的逻辑结论是:
您的some_command_writing_to_stdout必须以非零退出状态退出(显然,解析器以0存在).

这将解释为什么执行管道中的下一个命令(解析器),以及为什么脚本在此之后完成.

验证这一点很容易.只需将倒数第二个语句替换为:

(some_command_writing_to_stdout || true) | parser $2

标签:bash,shell,execution,stdout,linux
来源: https://codeday.me/bug/20191025/1931440.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有