首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何设置stty -echo并从/dev/stdin读取

如何设置stty -echo并从/dev/stdin读取
EN

Stack Overflow用户
提问于 2021-03-07 14:29:16
回答 1查看 376关注 0票数 0

我试图编写一个程序,它从stdin读取,也从tty接收用户输入。我想禁用用户输入的呈现,因为它扰乱了我的菜单系统,如果我重新绘制来删除它,会导致闪烁。但是,如果脚本接收到来自stdin的输入,我似乎不能使用stty -echo

下面是脚本的一个简化示例:

陷阱输入

代码语言:javascript
复制
#!/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

代码语言:javascript
复制
helloworld!

如我所料,运行$ ./trapinput将在启动时回显"Is“,并在运行程序其余部分时退出tty。它还防止用户输入被直接显示,允许我在屏幕上正确的位置打印它。

但是,如果我运行$ echo "test" | ./trapinput$ ./trapinput < hello.txt,它将回显“不是tty”,并且没有设置stty -echo,导致用户输入显示在我不想要的地方。

如何禁用用户输入的呈现,但保留在文本/使用文件重定向中管道的能力?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-07 15:30:47

如何禁用用户输入的呈现,但保留在文本/使用文件重定向中管道的能力?

在输入的位置禁用回波。做:

代码语言:javascript
复制
trap 'cleanup < /dev/tty' EXIT
trap 'hideinput < /dev/tty' CONT
hideinput </dev/tty

您还可以打开特定于输入exec 10</dev/tty等的文件描述符。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66517599

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档