如果其标准输入已被重定向,是否可以让 bash 脚本接受来自终端的输入?

如果其标准输入已被重定向,是否可以让 bash 脚本接受来自终端的输入?

假设我有一个 bash 脚本:

#!/bin/bash

read -p "Gimme some stuff: " stuff
echo "**${stuff}**"

如果脚本通过管道调用,例如:

echo "Here's some stuff" | ./myscript.bash

然后read命令将从管道读取。即使我尝试清除标准输入在我按下该read命令之前,它仍然会立即返回。

有什么办法可以解决这个问题吗?如果我无法控制脚本的调用方式,是否有办法强制它接受终端的输入?如果没有,除了从 stdinread以外select,还有其他更隐蔽的方法可以暂停脚本以获取用户的输入吗?

答案1

是的。终端始终是/dev/tty。只需read从终端而不是 stdin 获取其输入即可:

#!/bin/bash

read -p "Gimme some stuff: " stuff </dev/tty
echo "**${stuff}**"

在操作上,它看起来像这样:

$ echo asdfdsaf | read.sh
Gimme some stuff: 123
**123**

做同样事情的稍微复杂一点的方法

这里我们/dev/tty以文件描述符 3 打开。选项-u 3告诉read使用文件描述符 3:

exec 3<>/dev/tty
read -u 3 -p "Gimme some stuff: " stuff
echo "**${stuff}**"

相关内容