Não é possível 'colocar' comandos em uma 'tela' criada imediatamente após criá-la [duplicada]

2

Com referência à pergunta respondida: Enviando entrada para uma sessão de tela de fora

Estou tentando escrever um script que criará uma entrada screen e, em seguida, stuff (no meu caso, comandos UNIX) no shell que eu quero que execute.

Aqui está o que eu tenho até agora:

$ screen -dmS new_screen bash

$ screen -S new_screen -X stuff "cd /some/path/
some_script_file.sh
" <--This new line is required to execute the above command. 
$ # Note: See comments. We could insert the newline character instead of 'hard-coding' a newline string literal.

Por algum motivo, a tela é criada bem e entra no shell bash . Mas os comandos cd e some_script_file.sh não são preenchidos no shell bash da tela.

Agora a parte realmente estranha é .. Depois que eu me separar da tela, execute novamente o comando stuff como abaixo.

$ screen -S new_screen -X stuff "cd /some/path/
some_script_file.sh
"

e, em seguida, anexe novamente a nova tela. Agora vejo que os comandos foram corretamente preenchidos e executados no shell bash dentro da tela.

Não sei ao certo onde estou indo errado, parece haver algum problema em colocar comandos em uma tela ainda não conectada.

    
por Kent Pawar 18.11.2012 / 03:53

2 respostas

3

Quando uma sessão de tela é criada pela primeira vez, nenhuma janela é selecionada. Assim, quando você envia seus comandos, a tela não sabe para qual janela enviar. Depois de ter anexado à tela, no entanto, a janela foi selecionada, razão pela qual você pode enviar comandos depois de fazer isso. Para selecionar uma janela na linha de comando, você precisa usar a opção -p .

Aqui está uma modificação do seu comando que deve funcionar:

screen -S new_screen -p 0 -X stuff "cd /some/path/
some_script_file.sh
"
    
por 18.11.2012 / 04:37
0

@vgoff : "Então, um literal de retorno dentro da string. Isso funcionaria com pipes? Você ainda precisaria do retorno como o último caractere? vgoff "

Olhando para usar um literal de retorno ou um caractere de retorno (^ M):

bash-3.00$ echo "(1) This sentence
> (2) has
> (3) 3 returns
> (4) in it.
> " | grep "has";
(2) has

Bem parece que um literal de retorno não afeta pipping. E precisamos de um retorno antes da cotação de fechamento para agir como uma chave RETURN para enviar a instrução echo para execução.

    
por 18.11.2012 / 08:45

Tags