在bash中运行脚本时,如何在特定点向其发送击键?

时间:2018-07-30 14:00:34

标签: linux bash shell scripting sigint

我正在尝试编写脚本以在Linux中自动安装程序。在安装过程中需要一些用户输入。大多数都像简单的yn一样简单。我将这些响应添加到文件responses.txt中,然后将其通过管道传输到安装脚本中,如下所示:./start < responses.txt

但是,在安装中的特定点会出现复杂情况。该程序要求用户是否要跳过特定组件的安装,请在特定点点击CTRL+C。如果您在此有限的时间段内未点击CTRL+C,则脚本将继续执行并安装该组件。

我要安装不带此组件的程序。如何在此时间窗口内以编程方式发送CTRL+C

基于我的有限理解,我的自动化解决方案将需要一种方法来检测安装程序何时要求用户发送这些击键,然后我的脚本应发送某种中断?

甚至有可能做这样的事情吗?

2 个答案:

答案 0 :(得分:1)

在键盘上输入 Ctlr C 字符会导致设备驱动程序或伪终端发送中断信号(SIGINT)。因此,实际的 Ctlr C 永远不会到达程序。例外情况是,如果终端已设置为原始模式,但这不太可能。

您可以使用kill命令发送SIGINT信号:

kill -2 pid

脚本中面临的挑战是找到您需要杀死的进程,并将信号与其余输入进行交织。

如果您知道进程的名称,则可以使用psgrep找到进程ID。

您可以尝试通过将简单文本文件替换为脚本,然后将固定脚本的输入和终止信号交织在一起,然后将该脚本的输出通过管道传递到安装程序中。例如:

( echo "response 1"
  echo "response-2"
  sleep 1
  pid=$(ps -something | grep something | sed something)
  kill -2 $pid
) | installer

这可能会让您知道如何完成。

但是,正如其他地方建议的那样,有些工具可以为您完成这种事情。       回声

答案 1 :(得分:0)

如果要模拟与另一个程序的交互,通常使用expect。并且根据另一个SO post,它可以轻松发送 Ctlr C 字符,这些字符将被从属进程解释为SIGINT。