【问题标题】:How to set read command to execute without having to press Enter button in shell?如何设置读取命令以执行而无需在 shell 中按 Enter 按钮?
【发布时间】:2009-11-29 18:25:56
【问题描述】:

我使用以下代码将用户字符指定给变量 G:

read G

但是,为了继续执行我的脚本,我需要按 Enter 按钮。 是否可以以某种方式设置读取命令,使其在收到来自 stdin 的一个字母后立即将进程向前显示到下一行?

【问题讨论】:

    标签: shell unix


    【解决方案1】:

    如果您使用的是 Bash:

    read -n1 G
    

    您的系统默认配置为使用 dash,而 dash 不支持此功能,因此您还需要更改脚本的第一行以指定您希望使用 bash:

    #!/bin/bash
    

    【讨论】:

    • 这不起作用,它不再等待输入,只允许执行我的循环直到结束。
    • 这可能是因为您在脚本的其他地方有错误。尝试在一个新的空脚本中输入它,你会发现它工作得很好。
    • 所以你的意思是 read -n1 G 应该暂停脚本,直到它从标准输入接收到字符,然后继续执行而不等待输入被点击?
    • 顺便说一句:我按照你的建议编写的干净测试脚本给了我这样的信息:“read: 4: Illegal option -n”可能是因为我在写“#!/bin/sh “?
    • 我使用 bash 对此进行了测试。你用的是什么外壳?
    【解决方案2】:

    我认为dd 可能能够做到这一点,所以我尝试了一下,但没有成功。然而,谷歌为我找到了this,我在这里对其进行了改编:

    readOne () {
        local oldstty
        oldstty=$(stty -g)
        stty -icanon -echo min 1 time 0
        dd bs=1 count=1 2>/dev/null
        stty "$oldstty"
    }
    

    在脚本的开头定义一次这个函数,然后你可以像这样使用它:

    char=$(readOne)    # get the character
    echo $char         # print the character (or you can do something else with it)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-15
      • 1970-01-01
      • 2017-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多