Bash脚本有时有效,有时不起作用...管道问题

时间:2018-12-03 18:54:36

标签: bash pipe

我有一个奇怪的情况,Bash似乎没有正确分配我的变量之一,或者可能与管道有关。老实说,我不确定。这是代码:

test=0

if [ "$#" -ne 4 ]; then
    echo "Error: You have passed an incorrect number of parameters" > client.pipe
    test=1 

if [ $test -eq 1 ]; then <-------THIS SOMETIMES DOESN'T EXECUTE
    echo "end_result" > client.pipe
    exit 1

这是怎么回事,这是命令的服务器脚本:'select'。

select命令采用4个参数:一个id(告诉它要将消息输出到哪个管道),一个数据库名称,一个表名称以及一个列ID字符串。

在客户端管道的另一端,客户端脚本正在侦听消息,如果接收到“ end_result”,它将停止侦听。如您所见,无论发生什么情况,“ end_result”都应发送回管道并由客户端脚本打印,但有时不会发生,而我陷入无限的while循环中。这是客户端脚本,因此您可以查看“监听”发生的位置。

     while true; do
        read message < client.pipe
           if [ "$message" == "end_result" ]; then
              echo $message 
              break
           else
              echo $message
           fi
       done

如果我将错误数量的参数传递给第一个脚本,则会向管道输出“错误:您传递了不正确的参数数量”,但有时它没有为测试分配1然后不将“ end_result”发送到管道并退出。我真的看不出问题是什么,正如我所说的那样,它可能在10次中有7次...我可以通过将父脚本发送“ end_result”给客户端来解决此问题,但这是一个一点点的hack。

如果有人能看到问题所在,我将非常感谢,并且很高兴在需要时提供有关代码的更多信息。

非常感谢,R

编辑:

我几乎可以肯定,问题出在从客户端管道读取和while循环中,好像有些东西卡在管道中了...

1 个答案:

答案 0 :(得分:0)

这是@WilliamPursell提供的解决方案:

 while true; do
        read message 
           if [ "$message" == "end_result" ]; then
              echo $message 
              break
           else
              echo $message
           fi
       done < client.pipe