Bash 脚本管道障碍

Bash script pipe barrier

我当前的脚本如下所示:

#!/bin/bash

trap flush_buffer SIGUSR1

flush_buffer() {
    echo "flushing buffer" >&2
    [ -n "$buffer" ] && echo -e "$buffer"
    buffer=""
}

trap exit_script INT TERM

exit_script() {
    echo "script shutting down" >&2
    flush_buffer()
}

while read -r line; do
    [ -z "$buffer" ] && buffer="$line" || buffer="$buffer\n$line"
done

有这样的测试用例:

$(echo "ad-hoc run the script" | ./pipe-barrier.sh 2> /dev/null) == "ad-hoc run the script"

但这甚至都不起作用。

这段代码在以下情况下的表现是否正确?

感谢您的帮助:)

更新

#!/bin/bash

trap flush_buffer USR1

flush_buffer() {
    echo "flushing buffer" >&2
    [ -n "$buffer" ] && echo -e "$buffer"
    buffer=""
}

trap exit_script EXIT

exit_script() {
    echo "script shutting down" >&2
    flush_buffer
    exit 0
}

while read -r line; do
    [ -z "$buffer" ] && buffer="$line" || buffer="$buffer\n$line"
done

您的脚本中存在一些问题...从您的测试中删除 2> /dev/null 将为您提供有用的提示:

    flush_buffer()

函数调用应该是

    flush_buffer

另外,还有一个问题。当你 运行 没有输入时,你只是退出脚本,但永远不会刷新你的缓冲区......要么在 while 循环之后添加 flush_buffer 以在这种情况下调用它......或者还设置将其用作 EXIT.

上的处理程序设置陷阱

我想我也可以更新这个:你的更新......还有一个问题......如果你处理 INTTERM 信号,你 return 控制回到陷阱触发的地方(很可能是 while 循环):你想明确地从 exit_script.

exit

也根据文档:

A trap on EXIT is executed before the shell terminates.

所以...你真的只在 EXIT 上设置陷阱...否则万一被 SIGINTSIGTERM 绊倒,你会称它为(和冲洗)两次。一次打开两个信号...然后第二次退出时空 buffer