Como automatizar um pressionamento de tecla para um aplicativo de terminal cli como o ranger?

2

Eu gostaria de enviar um pressionamento de tecla ao ranger, quando eu tenho o ranger em execução e obtive o PID com:

Saída de 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

Seguindo o link , se eu enviar o valor j para o STDIN com: echo "j" > /proc/5440/fd/0 Parece que eu recebi j mixed na saída (depois que eu executei o comando algumas vezes):

No entanto, quando pressiono j no meu teclado, ele reage corretamente.

    
por Chris Stryczynski 18.11.2017 / 18:16

1 resposta

1

Isso porque, o

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

na verdade, é algo assim (o pts number pode ser diferente no seu caso):

echo "j" > /dev/pts/2 

Explicação:

Eu não tenho ranger , então eu estava rodando vim - a não diferença aqui, o mecanismo é o mesmo. Então, descobri o% PID vim e procurei no diretório 6466 :

$ 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

Todos os descritores de arquivo do processo /proc/6466/fd são links simbólicos para o terminal atual. Assim, o vim converte para o echo "j" > /proc/5440/fd/0 , o que significa literalmente: "Redirecionar a saída do comando echo "j" > /dev/pts/2 para o arquivo de terminal echo ". Não para o stdin do processo de /dev/pts/2 .

Tanto quanto eu sei, o terminal pode obter entrada apenas do teclado e não há como passar a entrada para ele de outra forma. Então, você precisa procurar outro método para transmitir comandos ao processo de trabalho.

Além disso, lembre-se de que vim adiciona a nova linha à saída, o que está causando a impressão de echo por escadas, no seu caso. Se alterar para j , a saída será echo -n j - sem novas linhas.

    
por 20.11.2017 / 00:49