Redirigiendo la salida estándar al argumento del programa

Redirigiendo la salida estándar al argumento del programa

Ejecuto un servidor de Minecraft en mi computadora portátil Arch Linux. El software del servidor para Minecraft se ejecuta como un programa interactivo en una línea de comando, por lo que lo inicio en una sesión de pantalla separada, lo que me permite volver a conectarlo cada vez que necesito acceder a él.

Para hacer esto utilicé un script (no uso screen en ningún otro momento, así que no te preocupes por "grep SCREEN")

#!/bin/bash

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

sudo screen -r $PID

Esto obtendrá el PID de la sesión de pantalla en la que se está ejecutando el servidor y luego lo volverá a conectar a esa pantalla.

Ahora me pregunto, como no puedo encontrar esto en ninguna parte, si puedo usar una sola línea para redirigir la salida de

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

directamente a $argumento en

sudo screen -r $argument

sin necesidad de abarcar 2 líneas

Básicamente quiero redirigir la salida estándar de awk a unargumentode pantalla, en lugar de como la entrada estándar de la pantalla.

Parece que debería ser relativamente fácil de encontrar y hacer, pero tengo muchos problemas para encontrar algo al respecto en Google.

¡Cualquier ayuda es apreciada! Gracias

Respuesta1

En lugar de ps aux | grep SCREEN | sed -n 1p | awk '{ print $2; }', podrías simplemente hacer

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

O, aún más recomendado, si instalas procps:

pgrep SCREEN

(Envuelva estos comandos entre comillas invertidas como se explica, o use la $()construcción que es más fácil de leer y anidar, y hace lo mismo).

O inclusomásRecomendado: si solo tienes una sesión de pantalla en ejecución, simplemente:

screen -r

se adjuntará de forma predeterminada a la única sesión existente.


Como se indica en un comentario: si quizás desee ejecutar varias sesiones de pantalla en el futuro, utilice la capacidad de nombrar sesiones. Iniciar una sesión con nombre con

screen -S minecraft

que luego se vuelve a unir con

screen -r minecraft

Respuesta2

xargs hará eso

$echo abc | xargs prog

En lo anterior, xargs ejecutará prog con arg abc, es decir $prog abc

Otro ejemplo

$ echo abc | xargs echo w x
w x abc

Respuesta3

Suponiendo que estás en bash, otra forma es usar comillas invertidas. AFAIK, las comillas invertidas se evalúan primero y el resultado se usa en el resto de la expresión.

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

Creo que eso debería hacer lo que quieres.

Como señaló otro comentarista, xargstambién puedes usarlo, pero me gusta reservarlo para cosas con múltiples argumentos. Siento que las comillas invertidas son más limpias para lo que quieres lograr.

información relacionada