如何自动对像 Ranger 这样的 cli 终端应用程序进行击键?

如何自动对像 Ranger 这样的 cli 终端应用程序进行击键?

当我让 Ranger 运行并获得它的 PID 时,我想向 Ranger 发送一个击键:

输出ps aux | grep '[/]usr/bin/python -O /usr/bin/ranger'

chris     5054  3.1  0.1 116248 27828 pts/0    S+   16:57   0:00 /usr/bin/python -O /usr/bin/ranger

继自https://serverfault.com/a/178470/135542,如果我将值发送j到它的 STDIN: echo "j" > /proc/5440/fd/0我似乎只是j在输出中混合(在我运行命令几次之后):

在此输入图像描述

但是,当我按下j键盘时,它会正确反应。

答案1

这是因为,

echo "j" > /proc/5440/fd/0 

事实上,是这样的(pts根据您的情况,数字可能有所不同):

echo "j" > /dev/pts/2 

解释:

我没有ranger,所以我正在运行vim- 这里没有区别,机制相同。然后,我找到了vim的 PID -6466并查看了/proc/6466/fd目录:

$ ls -l /proc/6466/fd
lrwx------ 1 minimax minimax 64 Nov 20 01:20 0 -> /dev/pts/2
lrwx------ 1 minimax minimax 64 Nov 20 01:20 1 -> /dev/pts/2
lrwx------ 1 minimax minimax 64 Nov 20 01:20 2 -> /dev/pts/2

进程的所有文件描述符vim都是到当前终端的符号链接。因此,echo "j" > /proc/5440/fd/0转换为echo "j" > /dev/pts/2,字面意思是:“将命令的输出重定向echo到终端文件/dev/pts/2”。不是vim进程的标准输入。

据我所知,终端只能从键盘获取输入,无法以其他方式将输入传递给它。因此,您需要寻找另一种方法,将命令传递给工作进程。

另外,请记住,在您的情况下,它echo会在其输出中添加换行符,这会导致j通过楼梯进行打印。如果将其更改为echo -n j,则输出将为jjj- 且不带换行符。

相关内容