代码之家  ›  专栏  ›  技术社区  ›  wiseindy

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

  •  0
  • wiseindy  · 技术社区  · 7 年前

    我正在尝试编写一个脚本来自动在Linux中安装程序。安装期间需要一些用户输入。大多数都是直截了当的 y n . 我将这些答复添加到文件中 responses.txt 然后像这样通过管道发送到安装脚本: ./start < responses.txt .

    然而,安装过程中的某个特定点会出现并发症。程序要求用户点击 CTRL+C 如果他们想跳过某个特定组件的安装,则在特定的点执行。如果你不打 CTRL+C 在这个有限的时间窗口中,脚本继续运行并安装这个组件。

    我想安装没有这个组件的程序。我怎么寄 CTRL+C 在这段时间内,以编程方式显示窗口?

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

    有没有可能做这样的事?

    2 回复  |  直到 7 年前
        1
  •  1
  •   rghome    7 年前

    这个 Ctlr C 当在键盘上输入字符时,会导致设备驱动程序或伪终端发送中断信号(sigint)。因此,实际 Ctlr C 从未参加过这个项目。例外情况是,如果终端已设置为原始模式,但这不太可能。

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

    kill -2 pid
    

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

    您可以使用 ps grep ,如果你知道它叫什么。

    您可以尝试交错固定输入和终止信号,方法是用脚本替换简单的文本文件,并将该脚本的输出通过管道传输到安装程序中。例如:

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

    这可能会让你知道怎么做。

    然而,正如其他地方所建议的,有一些工具可以为您做这种事情。 回声

        2
  •  0
  •   Serge Ballesta    7 年前

    如果你想模拟与另一个程序的交互, expect 通常是合适的工具。根据另一个,所以 post ,很容易发送 Ctlr C 从进程将解释为sigint的字符。