1

我正在尝试设置一个 IO 脚本以允许两个 FIFO 之间的输入/输出通信(一个 FIFO 用于输入,另一个用于输出)。

在我输入输入时,我的服务器必须接收输出。两者Internals/servout都是Internals/servinFIFO。我目前通过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 或类似的信号?finally我正在考虑一些可以与Python 中的关键字具有相同目的的东西,或者tail通过使用$$.

随意评论我的不良做法 -bash是我较新的语言之一,建设性的批评是改进的最快方法。

4

1 回答 1

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
于 2012-11-17T20:05:28.723 回答