我提前道歉 - 我没有完全理解我所要求的背后的想法,无法理解为什么它不起作用(我不知道我需要学什么)。我首先在堆栈交换中搜索答案 - 我发现了一些似乎可能相关的信息,但没有很好地解释这些概念,以至于我无法理解如何构建可行的解决方案。我一直在谷歌上搜索,但没有找到任何信息能够以我理解的方式准确描述正在发生的事情。任何可以帮助我理解正在发生的事情的背景概念的方向将不胜感激。
是否可以在从管道执行的 bash 脚本中获取用户输入?
例如:
wget -q -O - http://myscript.sh | bash
在脚本中:
read -p "Do some action (y/n): " __response
if [[ "$__response" =~ ^[Yy]$ ]]; then
echo "Performing some action ..."
fi
据我了解,这是行不通的,因为 read 尝试从 stdin 读取输入,而 bash 脚本当前正在“通过该管道执行”(我确信有一种更技术准确的方法来描述正在发生的情况,但是我不知道怎么办)。
我找到了一个建议使用的解决方案:
read -t 1 __response </dev/tty
然而,这也行不通。
任何关于我需要理解的概念的阐明或解释为什么它不起作用或解决方案将不胜感激。
The 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
提示来自read
出现在终端上并且read
在决定是否回显日期之前等待响应。
我上面写的内容与下面的内容有两个关键方面的不同:
read -t 1 __response </dev/tty
一、选项-t 1
gives read
一秒超时。其次,该命令不提供提示。这两者的结合可能意味着,尽管read
was briefly征求意见,你不知道。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)