【问题标题】:Bash script pipe barrier [closed]Bash脚本管道屏障[关闭]
【发布时间】:2020-10-04 03:44:13
【问题描述】:

我当前的脚本如下所示:

#!/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

【问题讨论】:

    标签: bash pipe buffer barrier bash-trap


    【解决方案1】:

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

        flush_buffer()
    

    函数调用应该是

        flush_buffer
    

    另外,另一个问题是。当您用完输入时,您只需退出脚本,但永远不要刷新缓冲区......要么在 while 循环之后添加 flush_buffer 在这种情况下调用它......或者也将其设置为处理程序设置诱捕EXIT


    我认为我也可以更新这个:您的更新...还有另一个问题...如果您处理 INTTERM 信号,您将控制权返回到设置陷阱的位置关闭(很可能是while 循环):您想从exit_script 明确地exit

    也根据文档:

    EXIT 上的陷阱在 shell 终止之前执行。

    所以...您实际上只在EXIT 上设置了一个陷阱...否则如果被SIGINTSIGTERM 绊倒,您将调用它(并刷新)两次。一次打开两个信号...然后第二次使用空的buffer 退出。

    【讨论】:

    • 感谢您的回答 :) 我更新了我的原始帖子,它的行为是否正确?
    • 不完全...您的处理程序处理但不处理exit 脚本,因此在SIGTERMSIGINT 的情况下它返回到read 循环。所以你需要明确退出exit_script。此外...这些信号将导致 shell 终止(也触发 EXIT)并且您不想运行相同的处理程序两次,所以您想要的只是 traping EXIT
    • 所以你的意思是我只需要捕获 EXIT 而不是 INT 和 TERM?如果正确,那么我应该在处理程序中添加exit 1 以在刷新缓冲区后退出脚本?
    • 我已经在上面写了,应该会更清楚...我会exit 0 除非您考虑任何异常终止的情况(听起来不是规范)。
    • 我再次更新了我的第一篇文章并进行了更正
    猜你喜欢
    • 2016-04-10
    • 1970-01-01
    • 2013-04-06
    • 2016-04-03
    • 2012-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-13
    相关资源
    最近更新 更多