Bash 回声控制字符

Bash 回声控制字符,bash,Bash,我需要对第三方程序的输出进行grep。此程序转储数据,但在未按^c终止数据的情况下不会终止 我目前正在使用它的pid搜索并杀死它。然而,我想知道是否有可能回显控制C字符。伪代码看起来像 echo ^c | ./program_that_does_not_terminate 我可以在DOS中做类似的事情,所以在linux中一定有办法 C:\>echo y | del C:\tmp\* C:\tmp\*, Are you sure (Y/N)? y C:\> 不,将CTRL-C字符导

我需要对第三方程序的输出进行grep。此程序转储数据,但在未按^c终止数据的情况下不会终止

我目前正在使用它的pid搜索并杀死它。然而,我想知道是否有可能回显控制C字符。伪代码看起来像

echo ^c | ./program_that_does_not_terminate
我可以在DOS中做类似的事情,所以在linux中一定有办法

C:\>echo y | del C:\tmp\*
C:\tmp\*, Are you sure (Y/N)? y
C:\>

不,将CTRL-C字符导入进程将不起作用,因为终端会捕获CTRL-C击键并将其转换为发送给进程的终止信号

CTRL-C的正确字符代码(ASCII)是代码编号3,但是,如果您将该代码回显到程序中,它将只接收来自其标准输入的字符。它不会导致进程终止

如果您想简化查找和终止进程的任务,可以使用以下方法:

./program_that_does_not_terminate &
pid=$!
sleep 20
kill ${pid}

$
将为您提供上次启动的后台进程的进程ID。

在Bash中,可以通过写入
$'\cc'
^C
作为命令行上的参数传递(从而传递给
echo
进行回送)。因此,所需的命令是:

echo $'\cc' | ./program_that_does_not_terminate echo$'\cc'./不终止的程序
我想,你需要更复杂的东西。如果要捕获程序的输出,不能立即向程序发送终止信号。与上面的示例相比,
del
命令等待输入,而CTRL+C不是直接输入,而是终止信号

我会建议一种解决方案,您可以确定是否捕获了所有输出,然后发送终止信号。无论如何,所有输出只能由您确定的时间点。

请尝试以下操作:

expect -c "send \003;"

正如@paxdiablo所说的,CTRL-C击键被终端捕获并转换为发送给进程的终止信号。因此,如果进程连接到终端,则可以将@jwodder提供的$'\cc'发送到该终端,让终端向进程发送实际的终止信号

步骤:

1.在中编译C文件

2.
sudo./a.out-n/dev/pts/0$'\cc'

#将/dev/pts/0更改为进程附加到的tty

虽然这将向程序发送正确的键序列,但不会导致程序退出。像CTRL-C这样的信号处理由终端而不是程序来完成。SIGINT(CTRL-C)由终端驱动程序+内核来处理。因此,发送chr(\003)(ascii中的CTRL-C)不会终止任何内容。想象一下,一个二进制程序中有多少CTRL-C,比如“ls”或soo。无论如何,如果执行
cat/bin/ls | strings
,则不会终止任何命令…)谢谢,我正在寻找如何回显Ctrl C。是否有某种方法将“^]”发送到telnet?使用此方法,但与
-n
一起使用,因为回显将附加一个换行符。例如,
echo-n$'\cc'>/dev/ttyUSB0
kill-s SIGINT
如果要发送它,请按Ctrl-C.upvoting。这似乎是唯一可能的解决办法!可以。但是,他将如何grep bg中运行的命令的输出呢?因为
yes | wc&
将返回wc的pid,而不是永远的yes命令,
(yes | wc)&
将返回bash pid,同样不是yes的pid。因此,IMHO唯一的方法是将这两个命令都发送到BG中,并从
ps
命令中按其名称杀死
yes
。或者,这里有一种更简单的方法,将永远运行并需要中断的命令的输出归为灰色(或计数)?虽然此代码可能会回答此问题,但提供有关为什么和/或如何回答此问题的附加上下文将显著提高其长期价值。请在你的答案中添加一些解释。这就是确切的答案。我需要发送一个“CTRL+C”指令来中断设备上的引导加载。发送
expect-c“send\003;”>/dev/ttyUSB0
成功了。谢谢
\003
是什么意思?如果我需要其他钥匙组合怎么办?如何找到要使用的代码?@SidneydeMoraes我有同样的问题,然后找到了这个页面:;它有一个十六进制代码到键的组合映射,希望这是有帮助的