Como posso iniciar várias sessões de tela a partir de um único script bash?

6

Eu escrevi um script (que não funciona) que se parece com algo assim:

#!/bin/sh

screen -dmS "somename" somecommand

for i in {0..5}; do
    screen -dmS "name$i" anothercommand $i
done

Por algum motivo, se eu copiar e colar isso em um terminal, ele cria 7 sessões de tela desanexadas, como esperado. No entanto, se eu executá-lo a partir de um script, recebo apenas a primeira sessão, "somename", quando executo screen -ls .

Editar: se o mesmo puder ser realizado de outra forma (por exemplo, com várias janelas de tela em vez de sessões), eu também abriria essas soluções. Obrigado!

    
por Eric 11.07.2011 / 02:39

4 respostas

5

Acabei levando essa pergunta para o StackOverflow, onde Brian Gerard respondeu à pergunta. A sintaxe {0..5} do loop é bash (3.x +) específica. Por padrão, meu sistema foi configurado para executar algum outro shell a partir de /bin/sh , então mudei meu shar-bang para #!/bin/bash e meu problema foi resolvido!

    
por 03.08.2011 / 22:57
4

Por que você precisa abrir tantas sessões de tela? Em vez disso, por que você não tenta criar várias janelas (quero dizer, como parte da janela de terminal de tela única) dentro de uma única sessão de tela. Você pode alternar entre eles com ctrl-a 1 ou 2 ou 3 etc, dependendo de quantos você criou e deseja visualizar a saída.

Isso parece uma má abordagem para a tela de corrida. Caso você não tenha ouvido falar de várias janelas na tela, leia qualquer tutorial na tela da web. O principal objetivo do design da tela é a multiplexação de janelas - não apenas anexando e desanexando.

    
por 11.07.2011 / 04:00
2

Infelizmente, não posso responder às suas comentário porque tenho pouca reputação, então vou ter que colocá-lo em uma resposta separada.

Você pode criar uma sessão de tela única com várias janelas usando um arquivo de configuração screenrc . A página de manobras diz tudo, mas aqui estão as coisas mais importantes que devem resolver o seu problema:

O screenrc a seguir cria uma sessão de tela com duas janelas. Uma janela estará executando bash , a outra estará executando python (interativamente):

sessionname myscreensession
screen -t command1 0 bash
screen -t command2 1 python

O nome myscreensession mostra quando executar screen -ls e pode ser usado como um parâmetro para screen -r . As strings commandN especificam os nomes das janelas dentro da sessão de tela. Os números (0 e 1) especificam em qual janela executar o comando (você não precisa usar números subseqüentes).

Você também pode adicionar outra janela com um novo comando à sessão da tela, por exemplo. com:

screen -X screen -S myscreensession -t command3 2 python3

Isso criaria uma nova janela executando python3 na sessão existente.

    
por 01.09.2014 / 00:32
0

Eu realmente não sei porque seu script não funciona, mas outra maneira de iniciar várias sessões de tela é criar um arquivo de configuração de tela personalizado. Foi discutido nesta questão do AskUbuntu: link

Eu acho que você poderia simplesmente criar o arquivo de configuração test.conf com o seguinte conteúdo e lançar screen -d -c test.conf

screen -S "somename" somecommand
screen -S "name1" anothercommand 1
screen -S "name2" anothercommand 2
...

E se funcionar, então o seu script pode primeiro criar este arquivo test.conf e personalizá-lo no loop com

echo "screen -S "name$i" anothercommand $i" >> test.conf

e, em seguida, inicie screen -d -c test.conf no final do script.

    
por 11.07.2011 / 03:57