Redirecionando stdout para argumento do programa

Redirecionando stdout para argumento do programa

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ê xargstambé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.

informação relacionada