Primeiro, uma nota sobre como inserir novas linhas facilmente:
Apenas um aviso que a construção $()
retira as novas linhas da saída do comando, para que as linhas de saída possam ser usadas como argumentos para outros programas. Isso pode causar um comportamento inesperado. Neste caso eu suponho que você está especificamente tentando enviar o equivalente de Enter keystroke. Embora o retorno de carro que você está enviando com \r
não seja distribuído, há várias maneiras mais fáceis de inserir esse caractere sem a necessidade do comando extra.
-
Você pode colocar uma nova linha regular dentro de suas aspas duplas
screen -S minecraft -X stuff "stop
"
-
Ou você pode inserir o caractere em uma linha terminal usando a seqüência Ctrl + v Enter . Isso será parecido com ^M
no terminal, mas é um caractere de nova linha especial.
screen -S minecraft -X stuff "stop^M"
Em segundo lugar, uma observação sobre o comportamento errático da tela. ( Explicação e solução de Gilles )
A tela tem um problema ao aceitar entrada para uma sessão de tela que nunca foi anexada. Se você executar isso, ele terá falhado:
screen -d -m -S minecraft zsh
screen -S minecraft -X stuff "stop^M"
screen -r minecraft
Mas se você executar isso, funcionará:
screen -d -m -S minecraft zsh
screen -r minecraft (then disconnect with Ctrl-a-d)
screen -S minecraft -X stuff "stop^M"
screen -r minecraft
Por último, você poderia usar o muito melhor comportado tmux
em vez de screen
.
O GNU-Screen tem sido um multiplexador de terminais de fato por muitos anos, mas há muito tempo deixou de ser desenvolvido e os bugs e peculiaridades não estão sendo consertados. O Tmux está em desenvolvimento ativo, inclui muitos recursos que a tela não pode tocar e seu comportamento pronto para uso é bastante mais intuitivo. Além disso, é melhor documentado. Veja como você converteria seu código:
# Start new detached tmux session with a named window pane running the java app
tmux new-session -d -n minecraft /usr/lib/java/bin/java [args]
# Send it keys to stop the mincraft server
tmux send-keys -t minecraft "stop^M"