Redirecionando o stdout para o argumento do programa

1

Eu corro um servidor Minecraft no meu laptop Arch Linux. O software para servidores do Minecraft é executado como um programa interativo em uma linha de comando, então eu inicio em uma sessão de tela desanexada, permitindo que eu conecte novamente toda vez que precisar acessá-lo.

Para fazer isso eu usei um script (eu não uso a tela a qualquer 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

Isto irá obter o PID da sessão de tela em que o servidor está sendo executado e, em seguida, reconectar a essa tela.

Agora estou me perguntando, como não consigo encontrar isso em lugar algum, se eu puder usar um de uma linha para redirecionar a saída de

ps aux | grep SCREEN | sed -n 1p | awk '{ print $2; }'

diretamente para $ argument em

sudo screen -r $argument

sem precisar de duas linhas

Basicamente eu quero redirecionar o stdout do awk para um argumento da tela, em vez de como o stdin da tela.

Isso parece ser relativamente fácil de encontrar e fazer, mas estou com dificuldades para encontrar algo sobre isso no Google.

Qualquer ajuda é apreciada! Obrigado

    
por Joe Bentley 03.06.2012 / 15:18

3 respostas

6

Em vez de ps aux | grep SCREEN | sed -n 1p | awk '{ print $2; }' , você poderia fazer

ps aux | awk '/SCREEN/{print $2;exit}'

Ou, ainda mais recomendado, se você instalar procps :

pgrep SCREEN

(Envolva esses comandos em backticks, conforme explicado, ou use a construção $() , que é mais fácil de ler e aninhar, e faz a mesma coisa.)

Ou até mesmo mais recomendado: se você tiver apenas uma única sessão de tela em execução, simplesmente:

screen -r
Por padrão,

será anexado à única sessão existente.

Como observado em um comentário: se você quiser executar várias sessões de Tela no futuro, use a capacidade de nomeação de sessão. Inicie uma sessão nomeada com

screen -S minecraft

que é então reconectado com

screen -r minecraft
    
por 03.06.2012 / 16:04
10

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
    
por 03.06.2012 / 15:31
4

Supondo que você esteja no bash, outra maneira é usar backticks. AFAIK, os backticks 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; }''

Acho que você deve fazer o que quiser.

Como outro comentarista apontou, você pode usar xargs também, mas eu gosto de reservar aquele para material multi-argumento. Eu sinto que os backticks são mais limpos para o que você quer realizar.

    
por 03.06.2012 / 15:36