Como executar um comando dentro da tela de modo que você possa voltar ao shell pai do comando?

3

Qual é a melhor maneira de executar um comando dentro de uma sessão de tela, de modo que seu shell pai possa ser acessado? Quero poder reiniciá-lo a partir da mesma sessão de tela.

O melhor que consegui criar é o seguinte:

$ cat mr-t.sh 
#!/bin/bash

top
exec /bin/bash

e depois:

screen -e'^\\' -S top-in-screen ./mr-t.sh

Então, se o top parar de rodar, eu vou pelo menos pegar um novo shell dentro da mesma sessão de tela com a qual posso trabalhar. Isso não é muito elegante, e eu não consigo me convencer de que o sinal será enviado para o processo correto se eu acertar C-c. Além disso, o C-z não funciona de todo.

Estou usando o bash 3.2.48 no OSX e 3.2.39 no Linux. Ambos são provavelmente corrigidos por fornecedores de sistemas operacionais.

Não há nada de especial no comando top , claro.

[Como um aparte, -e'^\\' reatribui a Chave da Tela Mágica de C-a (um padrão ruim se alguma vez houve uma) para C - \.]

    
por Michael Wolf 20.10.2010 / 23:35

3 respostas

0

Desde que fiz esta pergunta, adotei uma solução diferente, mas muito mais eficaz: use tmux .

Iniciar uma nova sessão nomeada e separada:

$ tmux new -d -s top

Envie um comando para sua janela zeroth.

$ tmux send-keys -t top:0 "top" C-m

C-m é equivalente a atingir o retorno. Muitas vezes é o que você quer; às vezes você vai querer deixar de fora.

O conjunto de comandos do

tmux 'está bem documentado. Por isso, é fácil escrever scripts muito mais complicados para orientá-lo.

Normalmente, isso seria uma resposta extremamente detestável, mas como é minha pergunta, eu me permito uma margem de manobra, especialmente porque nunca consegui que nenhum dos outros métodos funcionasse de maneira confiável. Em contraste, eu consegui rotear o tmux corretamente na primeira vez que tentei.

    
por 30.03.2016 / 20:50
7

Crie um ~/.screenrc.top da seguinte forma:

screen
stuff "top5"

Agora, execute screen -c ~/.screenrc.top . Nenhuma condição de corrida!

    
por 21.10.2010 / 06:05
1

Aqui está uma solução imperfeita que encontrei.

screen -e'^\\' -dmS top-in-screen

Então você pode executar:

screen -S top-in-screen -p 0 -X stuff 'top^M'

(Observe que, embora você só veja ^M , na verdade, você deve digitar C-v seguido imediatamente por C-m .)

É imperfeito porque (eu acho) existe uma condição de corrida entre a primeira e a segunda invocação da tela.

De link , que também contém muitas outras boas informações.

    
por 21.10.2010 / 00:52

Tags