Bash 未计算“读取行时”之后的读取(外壳)

Bash 未计算“读取行时”之后的读取(外壳),bash,shell,sh,Bash,Shell,Sh,我目前正试图调试我编写的一些脚本,但找不到执行“读取”指令的方法 总而言之,我有两个函数,一个是在管道后调用的“while read line”,另一个是在处理while read之后读取用户输入的函数 现在让我用代码解释一下: 这就是我调用函数$lines的方式,该函数包含多行,以“\n”分隔 echo$行|保存行 saveLines(){ # ... while read line ; do # processing lines done myOtherFunctio

我目前正试图调试我编写的一些脚本,但找不到执行“读取”指令的方法

总而言之,我有两个函数,一个是在管道后调用的“while read line”,另一个是在处理while read之后读取用户输入的函数

现在让我用代码解释一下:

这就是我调用函数$lines的方式,该函数包含多行,以“\n”分隔 echo$行|保存行

saveLines(){
  # ...
  while read line ; do
    # processing lines
  done
  myOtherFunction
}

myOtherFunction(){
  echo "I am here !" # <= This is printed in console
  read -p "Type in : " tmp  # <= Input is never asked to user, and the message is not printed
  echo "I now am here !" # <= This is printed in console
}
这段代码被简化了,但精神就在这里。 我试图在“read-p…”之前插入一个“read”指令,它似乎没有改变任何事情


所以,如果你能证明我的错误或者告诉我为什么会有这种行为,我会非常高兴。感谢您抽出时间

在稍微不同的背景下,这个问题非常接近。更准确地说,正如OP所解释的,命令run是

echo "$lines" | saveLines
这意味着存储行执行的代码的标准输入不再是终端,而是与echo的标准输出相同的描述符。。。指挥部

因此,为了解决这个问题,只需更换

…
read -p "Type in : " tmp
…


在调用myOtherFunction之前,循环需要以某种方式提前退出,这样才能消耗存储行的全部输入。或者,您可能希望myOtherFunction直接从/dev/tty读取,或者至少从标准输入以外的文件描述符读取;它只是有一个非零的退出状态,因为没有剩余的内容可读取,而且似乎read在试图显示提示之前检测到了这一点。@chepner我在while循环中有一些处理和写入文件的代码,“$lines”是有限的行数。你的意思是我需要在“$lines”的末尾加一行,然后加一个“if[…]then break;”在我的循环中?你能试着读入-p键入:tmp… read -p "Type in : " tmp </dev/tty …