如何设置 stty -echo 以及阅读 /dev/stdin
How to set stty -echo and also read from /dev/stdin
我正在尝试编写一个从 stdin 读取并从 tty 接收用户输入的程序。
我想禁用用户输入的呈现,因为它会扰乱我的菜单系统,如果我重绘以将其删除,则会导致闪烁。但是,如果脚本从标准输入接收输入,我似乎无法使用 stty -echo
。
这是脚本的简化示例:
trapinput
#!/bin/bash
hideinput()
{
if [ -t 0 ]; then
echo "Is tty"
save_state=$(stty -g)
stty -echo -icanon time 0 min 0
echo -ne "\e[?1049h\r" 1>&2;
else
echo "is not tty"
fi
}
cleanup()
{
if [ -t 0 ]; then
stty "$save_state"
echo -ne "\e[?1049l" 1>&2;
echo "exit tty"
else
echo "is not tty"
fi
}
trap cleanup EXIT
trap hideinput CONT
hideinput
input="$(< /dev/stdin)";
echo "$input"
while true;
do
read -r -sn1 < /dev/tty;
read -r -sn3 -t 0.001 k1 < /dev/tty;
REPLY+=$k1;
echo $REPLY
done
hello.txt
helloworld!
运行ning $ ./trapinput
将在启动时回显“Is tty”,在与 运行ning 程序的其余部分一起被杀死时回显“退出 tty”,正如我所期望的那样。它还可以防止直接显示用户输入,从而允许我将其打印在屏幕上的正确位置。
但是,如果我 运行 $ echo "test" | ./trapinput
或 $ ./trapinput < hello.txt
它将回显“不是 tty”并且未设置 stty -echo
导致用户输入显示在我做的地方不想要。
如何禁用用户输入的呈现但保留通过管道输入 text/use 文件重定向的能力?
How can I disable rendering of user input but retain the ability to pipe in text/use file redirection?
禁用回显您输入的位置。做:
trap 'cleanup < /dev/tty' EXIT
trap 'hideinput < /dev/tty' CONT
hideinput </dev/tty
您还可以打开特定于输入 exec 10</dev/tty
等的文件描述符
我正在尝试编写一个从 stdin 读取并从 tty 接收用户输入的程序。
我想禁用用户输入的呈现,因为它会扰乱我的菜单系统,如果我重绘以将其删除,则会导致闪烁。但是,如果脚本从标准输入接收输入,我似乎无法使用 stty -echo
。
这是脚本的简化示例:
trapinput
#!/bin/bash
hideinput()
{
if [ -t 0 ]; then
echo "Is tty"
save_state=$(stty -g)
stty -echo -icanon time 0 min 0
echo -ne "\e[?1049h\r" 1>&2;
else
echo "is not tty"
fi
}
cleanup()
{
if [ -t 0 ]; then
stty "$save_state"
echo -ne "\e[?1049l" 1>&2;
echo "exit tty"
else
echo "is not tty"
fi
}
trap cleanup EXIT
trap hideinput CONT
hideinput
input="$(< /dev/stdin)";
echo "$input"
while true;
do
read -r -sn1 < /dev/tty;
read -r -sn3 -t 0.001 k1 < /dev/tty;
REPLY+=$k1;
echo $REPLY
done
hello.txt
helloworld!
运行ning $ ./trapinput
将在启动时回显“Is tty”,在与 运行ning 程序的其余部分一起被杀死时回显“退出 tty”,正如我所期望的那样。它还可以防止直接显示用户输入,从而允许我将其打印在屏幕上的正确位置。
但是,如果我 运行 $ echo "test" | ./trapinput
或 $ ./trapinput < hello.txt
它将回显“不是 tty”并且未设置 stty -echo
导致用户输入显示在我做的地方不想要。
如何禁用用户输入的呈现但保留通过管道输入 text/use 文件重定向的能力?
How can I disable rendering of user input but retain the ability to pipe in text/use file redirection?
禁用回显您输入的位置。做:
trap 'cleanup < /dev/tty' EXIT
trap 'hideinput < /dev/tty' CONT
hideinput </dev/tty
您还可以打开特定于输入 exec 10</dev/tty
等的文件描述符