这是我对堆栈溢出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