shell读取似乎正在从文件中获取换行符(fifo或常规)

u5rb5r59  于 2022-11-16  发布在  Shell
关注(0)|答案(2)|浏览(150)

我想要实现的是将shell脚本连接到fifo上,并对读取的某些命令做出React(使用通常的read命令)。这看起来很简单,但令我惊讶的是,read命令并没有像我预期的那样做出React。请参见以下简单脚本:

#!/bin/bash

while true; do
        read ONE_SENTENCE
        echo Simon says : ${ONE_SENTENCE}
        sleep 1
done

我通过“./test.sh〈in.pipe”启动此程序,其中in.pipe是“mkfifoin.pipe”
现在,如果我用“echo test1〉in.pipe”在管道中写入sting,我会得到下面的结果:

stc@host:~$ ./test.sh < in.pipe 
Simon says : test1
Simon says :
Simon says :
Simon says :
Simon says :
Simon says :
Simon says :
Simon says :

换句话说,读取不会阻塞,它总是找到要读取的内容。我错过了什么?显然,我希望读取阻塞,直到有新数据

qlvxas9a

qlvxas9a1#

关键是只有在成功读取时才输出ONE_SENTENCE,例如

while :; do
  if read ONE_SENTENCE; then
    [ "$ONE_SENTENCE" = quit ] && break          ## convenient quit ability
    printf "Simon says : %s\n" "$ONE_SENTENCE"   ## output only on good read
  fi
  sleep 1
done

除非从fifo中有效读取一行,否则管道不会产生任何输出。
一个小的变化,方便地为你设置fifo,并在脚本退出时删除它。(下面避免使用大写的变量)

#!/bin/bash

pipe=in.pipe

trap "rm -r $pipe" EXIT

[ -p "$pipe" ] || mkfifo "$pipe"

while :; do
  if read line; then
    [ "$line" = quit ] && break
    printf "Simon says : %s\n" "$line"
  fi
  sleep .5
done < "$pipe"

脚本执行完全相同的操作(除了1/2秒sleep,但它创建fifo并设置trap以在进入读取循环之前删除它。

nbnkbykc

nbnkbykc2#

谢谢你的回答,同时我也得到了我想要的

#!/bin/bash

while true; do
    read ONE_SENTENCE < in.pipe
    echo Simon says : ${ONE_SENTENCE}
    sleep 1
done

上面的代码阻塞(如预期)...但我仍然不明白为什么第一个脚本没有阻塞...无论如何,无论如何,它都能工作

相关问题