当我让 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
- 且不带换行符。