nfa*_*rar 5 bash stdin wget pipe
我提前道歉 - 我并不完全理解我所要求的理念背后的理念,以便理解为什么它不起作用(我不知道我需要学习什么).我首先在堆栈交换中搜索了答案 - 我发现了一些似乎可能相关的信息,但没有充分解释这些概念,我理解如何构建一个可行的解决方案.我一直在谷歌搜索,但没有找到任何信息,以我理解的方式描述究竟发生了什么.任何可能帮助我了解正在发生的事情的背景概念的方向将非常感激.
是否可以在从管道执行的bash脚本中获取用户输入?
例如:
wget -q -O - http://myscript.sh | bash
Run Code Online (Sandbox Code Playgroud)
并在脚本中:
read -p "Do some action (y/n): " __response
if [[ "$__response" =~ ^[Yy]$ ]]; then
echo "Performing some action ..."
fi
Run Code Online (Sandbox Code Playgroud)
据我所知,这不起作用,因为读取stdin和bash脚本的读取尝试当前正在"通过该管道执行"(我确信有一种更技术更准确的方式来描述正在发生的事情,但是我不知道怎么样).
我找到了推荐使用的解决方案:
read -t 1 __response </dev/tty
Run Code Online (Sandbox Code Playgroud)
但是,这也不起作用.
任何关于我需要理解的概念以使其发挥作用的任何亮点,或解释为什么它不起作用或解决方案将不胜感激.
该tty解决方案有效。使用此代码进行测试,例如:
$ date | { read -p "Echo date? " r </dev/tty ; [ "$r" = "y" ] && cat || echo OK ; }
Echo date? y
Sat Apr 12 10:51:16 PDT 2014
$ date | { read -p "Echo date? " r </dev/tty ; [ "$r" = "y" ] && cat || echo OK ; }
Echo date? n
OK
Run Code Online (Sandbox Code Playgroud)
提示read出现在终端上并read等待响应,然后决定是否回显日期。
我上面写的内容与下面的内容有两个关键方面的不同:
read -t 1 __response </dev/tty
Run Code Online (Sandbox Code Playgroud)
首先,该选项-t 1给出read一秒的超时时间。其次,该命令不提供提示。这两者的结合可能意味着,尽管只是read简单地征求意见,但你并不知道。