读取时暂停 bash 脚本 (stdin) 循环



我正在制作一个通过管道(stdin(接收输入的脚本,如(other_command | my_script(。但是,在我阅读了整个标准之后,我需要暂停脚本并等待用户按回车键。

下面是一个示例脚本。

#!/bin/bash
if [[ -t 0 ]]; then
  echo "No stdin"
else
  echo "Got stdin"
  while read input; do
    echo $input
  done
fi
echo "Press enter to exit"
read

它的工作原理是这样的;

$ echo text | ./script
Got stdin
text
Press enter to exit
$

它跳过了我最后的read.

然而;

$ ./script
No stdin
Press enter to exit
stops here
$

从标准输入读取后,如何让read工作?有没有一个解决方案可以在Linux和OSX上运行?

您想从用户那里读取。如果 stdin 不是用户,您必须从其他地方读取。典型的选择是当前终端(此处为连接到 stderr 的终端,假设有一个终端(。

read -p "Press enter" < "$(tty 0>&2)"

默认情况下,tty在 stdin 上找到 tty 的名称,当 stdin 是管道时,这显然不起作用。因此,我们重定向以使其改为查看 stderr。

最新更新