AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 561747
Accepted
Just a learner
Just a learner
Asked: 2020-01-13 10:56:23 +0800 CST2020-01-13 10:56:23 +0800 CST 2020-01-13 10:56:23 +0800 CST

有什么理由使用这个自定义的 read_char 函数而不是内置的 read 命令?

  • 772

我不擅长 bash 和 Linux。我正在阅读一个脚本,我发现了以下函数。

get_char()
{
    SAVEDSTTY=`stty -g`
    stty -echo
    stty cbreak
    dd if=/dev/tty bs=1 count=1 2> /dev/null
    stty -raw
    stty echo
    stty $SAVEDSTTY
}

基本上,它用于实现这样的按任意键继续功能。

echo "Press any key to continue!"
char=`get_char`

我知道您可以使用内置read命令来实现这一点。例如:

read -rsn1 -p "Press any key to continue"

有什么理由使用这个函数而不是内置read命令?

shell-script read
  • 1 1 个回答
  • 136 Views

1 个回答

  • Voted
  1. Best Answer
    mosvy
    2020-01-13T14:14:31+08:002020-01-13T14:14:31+08:00

    问题中的get_char函数有问题 wrt 生成多字节字符的键,并且stty作用于标准输入但从[1]dd读取的事实/dev/tty,所以我将使用它的“固定”和简化版本进行比较:

    get_char(){
      _g=$(stty -g); stty raw -echo; dd count=1 2>/dev/null; stty "$_g"
    }
    

    k=$(get_char)和之间的一些区别read -rsn1 k是:

    1. 前者是便携式的;它在dash, bash,zsh等中的工作方式相同。read -rsn1仅在bash和中有效ksh。

    2. 当按下 likeF1键时,k=$(get_char)将设置为由键 ( )k生成的整个转义,而不是吃掉前导(Esc) 并留待以后使用。这同样适用于生成多个字符的任何键。F1^[OP^[OP

    3. Ctrl-C( VINTR)、Ctrl-Q( VQUIT) 或Ctrl-Z( VSUSP) 将导致k=$(get_char)设置k为原始控制字符 (\x03或\x11) \x1a,而在使用时会中断或暂停脚本read -rsn1[2]。


    [1] 如果它应该从控制 tty 中读取,那么使用它很简单k=$(get_char </dev/tty)

    [2]如果脚本用 暂停然后用 恢复,read -rsn1将无法恢复 tty 设置。Ctrl-Zfg

    从带有 line-editor 的 shell 使用时的示例——它本身会弄乱 tty 设置:

    $ bash -c 'read -rsn1 foo; echo "{$foo}"'
    <Ctrl-Z>
    [4]+  Stopped                 bash -c 'read -rsn1 foo; echo "{$foo}"'
    $ fg
    bash -c 'read -rsn1 foo; echo "{$foo}"'
    f<Enter>
    {f}
    $
    $ bash -c 'read -rsn1 foo; echo "{$foo}"'
    <Ctrl-Z>
    [4]+  Stopped                 bash -c 'read -rsn1 foo; echo "{$foo}"'
    $ fg
    bash -c 'read -rsn1 foo; echo "{$foo}"'
    foo<Enter>
    {f}
    $ oo
    bash: oo: command not found
    

    或者当从不与 tty 设置混淆的 shell 中使用时(例如dash):

    $ bash -c 'read -rsn1 foo; echo "{$foo}"'
    <Ctrl-Z>
    [1] + Stopped                    bash -c "read -rsn1 foo; echo \"{\$foo}\""
    $ <Blindly type f, g, Enter>bash -c "read -rsn1 foo; echo \"{\$foo}\""
    {e}
    $
    
    • 2

相关问题

  • 在awk中的两行之间减去相同的列

  • 打印文件行及其长度的脚本[关闭]

  • 通过命令的标准输出以编程方式导出环境变量[重复]

  • 按分隔符拆分并连接字符串问题

  • MySQL Select with function IN () with bash array

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve