Cada terminal que você abre recebe um único arquivo numerado (para ser exato, um dispositivo escravo pseudo-terminal (PTS)) em /dev/pts/
com quem ele pode ser reconhecido e endereçado. Para obter o nome de arquivo correspondente de uma janela de terminal, você pode usar, por exemplo, tty
(veja esta resposta para alternativas; leia man pts
para mais):
$ tty
/dev/pts/4
Você pode usar esse nome de arquivo, por exemplo, para redirecionar a saída para uma janela de terminal diferente da seguinte forma:
$ echo test >/dev/pts/4 # run anywhere
test # printed in terminal window 4
Você não pode realmente executar um comando em outro terminal, simplesmente porque não é o terminal que executa um comando, mas sim o shell que normalmente é executado em um terminal. No entanto, você pode emular o comportamento de um comando executado em uma janela de terminal com redirecionamentos da seguinte maneira (tirados de pseudo-terminais do Linux: executando a sequência de caracteres enviada de um terminal em outro ):
echo test </dev/pts/4 &>/dev/pts/4
Se você quiser exibir o comando que você executou também recomendo escrever uma função ( Como eu uso $ * ao omitir determinada entrada variáveis como $ 1 e $ 2 no script bash? ), por exemplo:
run_in(){
t=/dev/pts/$1 &&
echo "${*:2}" >$t &&
eval "${@:2}" <$t &>$t
}
Em uma linha:
run_in(){ t=/dev/pts/$1&&echo "${*:2}" >$t&&eval "${@:2}" <$t &>$t;}
Use assim:
$ run_in 4 echo test # run anywhere
$ echo test # printed in terminal window 4 (if prompt was already there)
test # printed in terminal window 4
Neste cenário, os únicos desconhecidos são os números /dev/pts/?
que seu programa Python deve usar. Uma maneira possível de obter esses números é lançar suas próprias janelas de terminal, que produzirão seus 'números' em um arquivo, então você pode lê-lo [ ref ] . Vamos supor que você esteja usando gnome-terminal
, a parte relevante do código Python poderia ser algo como [ ref ] :
#!/usr/bin/python
import os
import subprocess
os.system("gnome-terminal -x bash -c 'tty > /tmp/my-app-tty-1; exec bash'")
my_terminal_1 = subprocess.Popen(["cat", "/tmp/my-app-tty-1"], stdout=subprocess.PIPE).communicate()[0]
command = "echo Test on: $(date) >" + my_terminal_1
print my_terminal_1
print command
os.system(command)
Se for um script em Perl [ ref ]
#!/usr/bin/perl
os.system("gnome-terminal -x bash -c 'tty > /tmp/my-app-tty-1; exec bash'");
my $my_terminal_1 = 'cat /tmp/my-app-tty-1';
my $command = "echo Test on: \$\(date\) > $my_terminal_1";
print ("$my_terminal_1");
print ("$command");
os.system("$command");