Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 当脚本在bash中运行时,如何在特定点向脚本发送击键?_Linux_Bash_Shell_Scripting_Sigint - Fatal编程技术网

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

Linux 当脚本在bash中运行时,如何在特定点向脚本发送击键?,linux,bash,shell,scripting,sigint,Linux,Bash,Shell,Scripting,Sigint,我正在尝试编写一个脚本,以便在Linux中自动安装程序。安装过程中需要一些用户输入。大多数都是简单的y或n。我将这些响应添加到一个文件responses.txt,然后像这样将其导入安装脚本:/start

我正在尝试编写一个脚本,以便在Linux中自动安装程序。安装过程中需要一些用户输入。大多数都是简单的
y
n
。我将这些响应添加到一个文件
responses.txt
,然后像这样将其导入安装脚本:
/start

但是,在安装过程中的特定点会出现复杂情况。如果用户想跳过特定组件的安装,程序会要求用户在特定点按CTRL+C。如果在此有限的时间窗口内未按CTRL+C键,脚本将继续并安装此组件

我想安装没有这个组件的程序。在这个时间窗口中,如何以编程方式发送
CTRL+C

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


甚至可以这样做吗?

如果您想模拟与其他程序的交互,通常是合适的工具。根据另一个SO,它可以很容易地发送Ctlr C字符,这些字符将被从进程解释为SIGINT。

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

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

kill -2 pid
在脚本中,您面临的挑战将是找到需要终止的进程,并将信号与其余输入交错

如果您知道进程id的名称,可以使用
ps
grep
查找进程id

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

( echo "response 1"
  echo "response-2"
  sleep 1
  pid=$(ps -something | grep something | sed something)
  kill -2 $pid
) | installer
这可能会让你知道怎么做

然而,正如其他地方所建议的,有一些工具可以为您完成这类工作。
echo

将a
CTRL+C
字符传送到程序不会终止它
有关原因的更多信息,请参见此处:因此,您必须想出一种不同的方法来自动执行此操作。您可以更新脚本,还是一开始就避免调用它?当程序不遵循良好的UNIX实践并且难以自动化时,这真的很困难。一个好的安装脚本不仅是交互式的,而且还可以由命令行参数或配置文件控制。当您点击CTRL-C(在类似unix的环境中)时,您将向前台进程发送SIGINT。很可能,你只需要使用
kill
来发送信号。@JohnKugelman你说得对。我必须探索更多选项,例如可能修改安装脚本。看起来这并不简单。看看你可以在后台启动一个程序,然后用shell脚本和它对话。