【问题标题】:read command doesn't wait for input读取命令不等待输入
【发布时间】:2013-04-01 13:30:05
【问题描述】:

我在 bash 中执行一个简单的脚本时遇到问题。脚本是这样的:

#! /bin/sh

read -p 'press  [ENTER]  to continue deleting line'
sudo sed -ie '$d' /home/hpccuser/.profile

当我使用 ./script 执行脚本时,输出是这样的:

press  [ENTER]  to continue deleting line./script: 3: read: arg count
[sudo] password for user

我直接在终端中运行读取命令(从脚本复制并粘贴到终端),它工作正常;它等待 ENTER 被击中(就像暂停一样)。

【问题讨论】:

    标签: bash wait readline


    【解决方案1】:

    由于您的脚本以 #!/bin/sh 而不是 #!/bin/bash 开头,因此不能保证您有可用的 bash 扩展(例如 read -p),并且只能依赖符合标准的功能。

    请参阅the relevant standards document 以获取保证在read 中存在的功能列表。

    在这种情况下,您可能需要两行,一行用于打印,另一行用于读取:

    printf 'press [ENTER] to continue deleting...'
    read _
    

    【讨论】:

    • 我检查了一下,我的 $SHELL 是 bash。所以 /bin/sh 会启动 bash。我错了吗?
    • @mohammadhmontazeri /bin/sh 启动任何一个 shell,好吧,/bin/sh——不是你的 $SHELL。此外,以/bin/sh 启动bash(在/bin/shbash 的符号链接的情况下)会禁用大量功能。
    • @mohammadhmontazeri 请参阅mywiki.wooledge.org/BashGuide/Practices#Choose_Your_Shell 了解更多信息。
    • 感谢您教我将 $REPLY 作为 read @CharlesDuffy 使用的默认变量!
    • 感谢 charles,使用 /bin/bash 更正了脚本。在您发送的最后一个链接中也提到了它。
    【解决方案2】:

    你也可以使用 echo 命令来做到这一点!:

        echo "press  [ENTER]  to continue deleting line"
        read continue
    

    【讨论】:

    • 如果您的 shell 是 sh,这并不能真正解决问题,因为例如Dash 不允许您在没有变量名称的情况下调用 read
    • 使用echo(除非您有一个支持-n,这是一个不需要实现的可选功能shell),您可以通过这种方式获得一个额外的换行符原始read -p 代码。
    【解决方案3】:
    read -p " Ici mon texte " continue
    

    它适用于 raspbian

    【讨论】:

    • 完全没有帮助。
    • 回答者以及该社区的新手可能会发现,了解拒绝投票背后的更彻底原因会有所帮助。
    【解决方案4】:

    似乎我迟到了,但echo -n "Your prompt" && sed 1q 在符合 POSIX 的 shell 上成功了。 这会打印一个提示,并从 STDIN 中获取一行。

    或者,您可以将该输入扩展为变量:

    echo -n "Your prompt"
    YOUR_VAR=$(sed 1q)
    

    【讨论】:

      【解决方案5】:

      如果您使用管道将内容重定向到您的函数/脚本,它将在子 shell 中运行您的命令并将 stdin (0) 设置为管道,可以通过以下方式进行检查

      $ ls -l /dev/fd/
      lr-x------ 1 root root 64 May 27 14:08 0 -> pipe:[2033522138]
      lrwx------ 1 root root 64 May 27 14:08 1 -> /dev/pts/11
      lrwx------ 1 root root 64 May 27 14:08 2 -> /dev/pts/11
      lr-x------ 1 root root 64 May 27 14:08 3 -> /proc/49806/fd
      

      如果您在该函数/脚本中调用了read/readarray/... 命令,则read 命令将立即返回从该管道读取的任何内容,因为标准输入已设置为该管道而不是tty,这解释了为什么read 命令没有等待输入。要让read 命令在这种情况下等待输入,您必须在调用read 命令之前通过exec 0< /dev/tty 将stdin 恢复为tty。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-12-04
        • 1970-01-01
        • 1970-01-01
        • 2022-11-10
        • 1970-01-01
        • 1970-01-01
        • 2023-02-14
        • 2014-06-05
        相关资源
        最近更新 更多