
Eu executo um servidor Minecraft em meu laptop Arch Linux. O software de servidor para Minecraft é executado como um programa interativo em uma linha de comando, então eu o inicio em uma sessão de tela separada, permitindo que eu reconecte sempre que precisar acessá-lo.
Para fazer isso usei um script (não uso screen em nenhum outro momento, então não se preocupe com "grep SCREEN")
#!/bin/bash
PID=ps aux | grep SCREEN | sed -n 1p | awk '{ print $2; }'
sudo screen -r $PID
Isso obterá o PID da sessão de tela em que o servidor está sendo executado e, em seguida, será reconectado a essa tela.
Agora estou me perguntando, como não consigo encontrar isso em lugar nenhum, se posso usar uma linha para redirecionar a saída de
ps aux | grep SCREEN | sed -n 1p | awk '{ print $2; }'
diretamente para $argumento em
sudo screen -r $argument
sem precisar abranger 2 linhas
Basicamente eu quero redirecionar o stdout do awk para umargumentoda tela, em vez de ser o stdin da tela.
Parece que deve ser relativamente fácil de encontrar e fazer, mas estou tendo muitos problemas para encontrar algo sobre isso no Google.
Qualquer ajuda é apreciada! Obrigado
Responder1
Em vez de ps aux | grep SCREEN | sed -n 1p | awk '{ print $2; }'
, você poderia simplesmente fazer
ps aux | awk '/SCREEN/{print $2;exit}'
Ou, ainda mais recomendado, se você instalar procps
:
pgrep SCREEN
(Coloque esses comandos em crases conforme explicado ou use a $()
construção que é mais fácil de ler e aninhar e faz a mesma coisa.)
Ou, mesmomaisrecomendado: se você tiver apenas uma sessão de tela em execução, simplesmente:
screen -r
será anexado por padrão à única sessão existente.
Conforme observado em um comentário: se você quiser executar várias sessões de tela no futuro, use a capacidade de nomenclatura de sessão. Inicie uma sessão nomeada com
screen -S minecraft
que é então recolocado com
screen -r minecraft
Responder2
xargs fará isso
$echo abc | xargs prog
Acima, xargs executará prog com arg abc, ou seja $prog abc
Outro exemplo
$ echo abc | xargs echo w x
w x abc
Responder3
Supondo que você esteja no bash, outra maneira é usar crases. AFAIK, os crases são avaliados primeiro e o resultado é usado no restante da expressão.
sudo screen -r `ps aux | grep SCREEN | sed -n 1p | awk '{ print $2; }'`
Eu acho que isso deve fazer o que você quiser.
Como outro comentarista apontou, você xargs
também pode usar, mas gosto de reservar esse para assuntos com vários argumentos. Eu sinto que os backticks são mais limpos para o que você deseja realizar.