【问题标题】:BASH: Listening for user input without waiting to do other processesBASH:侦听用户输入而不等待执行其他进程
【发布时间】:2017-01-15 12:19:48
【问题描述】:

好的,我有一个简单的脚本,其结构如下。我有这个将无限期运行的子进程。截至目前,它只会在用户手动终止进程时停止。我想知道是否有一种方法可以在不卡在read 行的情况下听取用户的输入。也就是说,在子进程运行的同时,在后台查看用户是否在终端输入“quit\n”。

...

if [[ option = "3" ]]; then
    while [2 -lt 4]; #THIS IS WHERE I WANT TO CHANGE TO LISTENING FOR INPUT TO QUIT
        #Some sub process that continues to run
    done
fi

....

感谢您的帮助!抱歉,如果这措辞不好,我想不出更好的方式来描述这个问题。至于我的头脑风暴尝试,我知道可以在while 条件中使用一个变量并说这样做直到它等于“退出”,但是将该变量设置为输入是我迷路的地方。

【问题讨论】:

  • 子进程是否需要与终端交互(即专门读取输入和/或产生输出),或者它是否具有与用户交互的不同方式的进程,例如有一个X11 GUI界面?
  • @wojtow,不,它没有。它在终端中打印出来,但它根本不与用户交互。事实上,用户甚至无法通过Ctrl + C 来阻止它。感谢您的帮助!

标签: linux bash input process while-loop


【解决方案1】:

不确定我是否理解正确,但您是否正在寻找类似的东西?

while [[ 2 -lt 4 ]] ; do
        read -t .1 user_input
        [[ ${user_input} == "exit" ]] && exit 0
done

或者更简单:

unset user_input
while [[ "${user_input}" != "exit" ]] ; do
        read -t .1 user_input
done

一般来说,您可以通过read -t 实现您想要的。

-t 超时 如果完整的输入行(或规范)导致读取超时并返回失败 指定的字符数)在超时秒内未读取。超时可能是 小数点后有小数部分的十进制数。这 仅当 read 正在从终端、管道或其他设备读取输入时,该选项才有效 特殊文件;从常规文件读取时它没有效果。如果阅读次数 out, read 将读取的任何部分输入保存到指定的变量名中。如果 timeout 为 0,read 立即返回,不尝试读取任何数据。这 如果输入在指定的文件描述符上可用,则退出状态为 0,非零 否则。超过超时退出状态大于128。

【讨论】:

  • 这听起来很完美!谢谢@wisent!如果子进程控制终端,这会起作用吗?我问的原因是因为它正在尝试 ssh,所以我不确定范围是否重要。对不起,我是 bash 的新手!无论如何,谢谢你的提示,我会试试看!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-08
  • 2015-09-19
  • 2018-04-02
相关资源
最近更新 更多