我正在尝试设置IO脚本以允许两个FIFO之间的输入/输出通信(一个FIFO用于输入,另一个用于输出)。
当我输入输入时,我的服务器必须接收输出。 Internals/servout
和Internals/servin
都是FIFO。我目前通过在等待输入时在后台运行tail
来实现此目的。
这是我目前的代码:
#!/bin/bash
# io.sh
tail -f -n 0 Internals/servout &
tpid=$!
read -p ">> " v
while [ $? -eq 0 ] && [ "$v" != "exit" ] && [ "$v" != "quit" ]; do
echo $v > Internals/servin
sleep .2
read -p ">> " v
done
kill $tpid
我遇到的主要问题是我不小心输入Ctrl-C来结束我的脚本。发生这种情况时,tail -f -n 0 Internals/servout &
代码将继续在后台运行。正如您可能想象的那样,这是不可取的。
有没有办法确保tail
命令被杀死,即使发送了SIGINT或类似的信号?我正在思考一些与Python中的finally
关键字具有相同目的的东西,或者使用tail
使$$
命令依赖于当前脚本的过程。
随意评论我的不良做法 - bash
是我的新语言之一,建设性的批评是最快的改进方式。
答案 0 :(得分:1)
您可以尝试这样的事情:
#!/bin/bash
# io.sh
cleanup() {
[[ -n $tpid ]] && kill $tpid
}
trap 'cleanup' SIGHUP SIGINT SIGTERM EXIT
tail -f -n 0 Internals/servout &
tpid=$!
quitflag=0
while ((!quitflag)) && read -p ">> " v; do
case $v in
exit | quit)
quitflag=1
;;
help | '?')
echo "Sorry, I can't help you."
;;
esac
echo "$v" > Internals/servin
done