【问题标题】:Why wont Bash wait for read when used with Curl?为什么 Bash 与 Curl 一起使用时不会等待读取?
【发布时间】:2011-09-27 12:17:55
【问题描述】:

我写了一个Bash script to congfigure Git。它使用 read 内置函数,但是当我这样做时:

bash < <(curl -s https://raw.github.com/gist/419201/gitconfig.bash)

它不会等待我输入。如何让它等待?

【问题讨论】:

  • 如何输入?你用 重定向标准输入
  • @jcomeau_ictx 我想我是......这些箭头在这种情况下意味着什么?
  • 单个

标签: bash shell curl pipe sh


【解决方案1】:

我按照 jcomeau_ictx 的建议在不使用 &lt; 的情况下对其进行了测试,并且成功了。

bash <(curl -s https://raw.github.com/gist/419201/gitconfig.bash | head -n 3)

注意:我使用head -3 在读取后停止执行。

【讨论】:

  • @jcomeau_ictx 我只是根据你的提示发布了一个答案,现在我得到了认可,对此我很抱歉。
  • MattDiPasquale,去掉“head -n 3”,那只是为了林奇的测试
  • @MattDiPasquale 是的,因为 head -n3 我不想在我的环境中执行你的脚本。我只是在测试读取部分。
  • 从不ever为此感到难过。实际上,您对我的答案的阅读比预期的要多,教会了我一些东西,并且大大改进了我的答案。一场大胜利。 StackOverflow 是处理这类事情的绝佳媒介!
  • 糟糕。我才意识到这一点并删除了我的评论。甜,它有效!
【解决方案2】:

您可以尝试直接从控制终端 /dev/tty read 重新启用用户输入,以防标准输入已被重定向,即文件描述符 0 未在终端上打开。

您甚至可以使用test 命令的-t 选项以编程方式处理这种情况(请参阅help testman test)。

read git_name < /dev/tty       # per-command I/O redirection
#read git_name < /dev/console  # alternative

exec 0</dev/tty               # script-wide I/O redirection
read git_name

【讨论】:

    【解决方案3】:

    为了使用标准输入,您需要获取文件,例如 /tmp,然后是 bash /tmp/gitconfig.bash。你现在这样做的方式是重定向标准输入,而 Unix 没有像 VMS 那样用于命令输入的单独文件描述符。

    【讨论】:

    • 不,但您可以告诉read 使用一个,并在运行脚本之前运行exec/dev/tty 重定向到其中。
    • 你的意思是 exec 1/tty 在脚本的开头?似乎可行。我的第一个想法是如何让它在不修改的情况下工作。
    • @Ignacio Vazquez-Abrams 你能分享一下我在答案中如何做到这一点的示例代码吗?
    猜你喜欢
    • 1970-01-01
    • 2013-05-14
    • 1970-01-01
    • 2021-12-27
    • 1970-01-01
    • 1970-01-01
    • 2021-12-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多