我正在制作一个通过管道(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。