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

gli*_*dud 6 terminal bash command-line

假设我有一个 bash 脚本:

#!/bin/bash

read -p "Gimme some stuff: " stuff
echo "**${stuff}**"
Run Code Online (Sandbox Code Playgroud)

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

echo "Here's some stuff" | ./myscript.bash
Run Code Online (Sandbox Code Playgroud)

然后read命令将从管道中读取。即使我在点击该命令之前尝试清除 stdinread,它仍然会立即返回。

有什么办法吗?如果我无法控制调用脚本的方式,有没有办法强制它接受 areadselect来自终端的输入?如果没有,是否有任何偷偷摸摸的方法来暂停脚本以从标准输入以外的用户那里获取输入?

Joh*_*024 7

是的。终端总是/dev/tty。所需要做的就是read从终端而不是标准输入获取输入:

#!/bin/bash

read -p "Gimme some stuff: " stuff </dev/tty
echo "**${stuff}**"
Run Code Online (Sandbox Code Playgroud)

在操作中,这看起来像:

$ echo asdfdsaf | read.sh
Gimme some stuff: 123
**123**
Run Code Online (Sandbox Code Playgroud)

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

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

exec 3<>/dev/tty
read -u 3 -p "Gimme some stuff: " stuff
echo "**${stuff}**"
Run Code Online (Sandbox Code Playgroud)