假设我有一个 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}**"