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
.
上的处理程序设置陷阱
我想我也可以更新这个:你的更新......还有一个问题......如果你处理 INT
和 TERM
信号,你 return 控制回到陷阱触发的地方(很可能是 while
循环):你想明确地从 exit_script
.
exit
也根据文档:
A trap on EXIT
is executed before the shell terminates.
所以...你真的只在 EXIT
上设置陷阱...否则万一被 SIGINT
或 SIGTERM
绊倒,你会称它为(和冲洗)两次。一次打开两个信号...然后第二次退出时空 buffer
。
我当前的脚本如下所示:
#!/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
.
我想我也可以更新这个:你的更新......还有一个问题......如果你处理 INT
和 TERM
信号,你 return 控制回到陷阱触发的地方(很可能是 while
循环):你想明确地从 exit_script
.
exit
也根据文档:
A trap on
EXIT
is executed before the shell terminates.
所以...你真的只在 EXIT
上设置陷阱...否则万一被 SIGINT
或 SIGTERM
绊倒,你会称它为(和冲洗)两次。一次打开两个信号...然后第二次退出时空 buffer
。