【问题标题】:How do you get user input when running a bash script from a url?从 url 运行 bash 脚本时如何获取用户输入?
【发布时间】:2014-11-11 19:14:23
【问题描述】:

考虑一下这个 bash 脚本:

#!/bin/bash
while true; do
    read -p "Give me an answer ? y/n : " yn
    case $yn in
        [Yy]* ) answer=true ; break;;
        [Nn]* ) answer=false ; break;;
        * ) echo "Please answer yes or no.";;
    esac
  done

if $answer 
  then 
    echo "Doing something as you answered yes"
      else 
    echo "Not doing anything as you answered no" 
fi

从命令行运行时使用:

$ ./script-name.sh

脚本按预期工作,等待您回答 yn

但是,当我上传到一个 url 并尝试使用 :

运行它时
$ curl http://path.to/script-name.sh | bash

脚本说Please answer yes or no. 我陷入了一个永久循环,显然脚本正在接收除 yn 之外的某种输入。

这是为什么?更重要的是,如何从 url 调用的 bash 脚本中实现用户输入?

【问题讨论】:

  • 您已经为 shell 重定向了标准输入。这就是您的脚本的来源。因此,当 bash 尝试从标准输入中读取 more 信息时,它只会得到 EOF 并旋转。
  • 试试read -p "Give me an answer ? y/n : " yn < /dev/tty
  • 好吧 cat script-name.sh | bash 也不会比你的 curl 命令更好......
  • 使用 zentity ```

标签: bash shell curl command-line


【解决方案1】:

也许使用显式本地重定向:

read answer < /dev/tty

【讨论】:

  • 我在这个答案中遇到的问题是读取发生在回声解释要键入的内容发生之前......
  • @DavidSulpy 试试这个:read -p "Enter answer:" answer &lt; /dev/tty
【解决方案2】:

你可以这样运行它:

bash -c "$(curl -s http://path.to/script-name.sh)"

由于您将 bash 脚本的内容提供给 bash 解释器。使用curl -s 进行静默执行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-18
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    • 2020-05-16
    • 2021-07-13
    • 1970-01-01
    相关资源
    最近更新 更多