Umleitung von stdout zum Programmargument

Umleitung von stdout zum Programmargument

Ich betreibe einen Minecraft-Server auf meinem Arch Linux-Laptop. Die Serversoftware für Minecraft läuft als interaktives Programm auf einer Befehlszeile, sodass ich sie in einer separaten Bildschirmsitzung starte und sie jedes Mal neu verbinden kann, wenn ich darauf zugreifen muss.

Dazu habe ich ein Skript verwendet (ich verwende screen sonst nicht, machen Sie sich also keine Gedanken über „grep SCREEN“).

#!/bin/bash

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

sudo screen -r $PID

Dadurch wird die PID der Bildschirmsitzung abgerufen, in der der Server ausgeführt wird, und dann die Verbindung zu diesem Bildschirm wiederhergestellt.

Nun frage ich mich, da ich das nirgends finden kann, ob ich einen Einzeiler verwenden kann, um die Ausgabe von

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

direkt zu $argument in

sudo screen -r $argument

ohne dass zwei Zeilen erforderlich sind

Im Grunde möchte ich die Standardausgabe von awk umleiten in eineStreitdes Bildschirms, statt als Standardeingabe des Bildschirms.

Dies scheint relativ einfach zu finden und durchzuführen zu sein, aber ich habe große Schwierigkeiten, bei Google etwas darüber zu finden.

Jede Hilfe ist willkommen! Danke

Antwort1

Anstatt von ps aux | grep SCREEN | sed -n 1p | awk '{ print $2; }'könnten Sie einfach Folgendes tun:

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

Oder, noch empfehlenswerter, wenn Sie Folgendes installieren procps:

pgrep SCREEN

(Umschließen Sie diese Befehle wie erläutert mit Backticks oder verwenden Sie die $()Konstruktion, die einfacher zu lesen und zu verschachteln ist und dasselbe bewirkt.)

Oder auchmehrempfohlen: Wenn Sie nur eine einzige Screen-Sitzung ausführen, gehen Sie einfach wie folgt vor:

screen -r

wird standardmäßig an die einzige bestehende Sitzung angehängt.


Wie in einem Kommentar erwähnt: Wenn Sie in Zukunft möglicherweise mehrere Screen-Sitzungen ausführen möchten, verwenden Sie die Möglichkeit zur Sitzungsbenennung. Starten Sie eine benannte Sitzung mit

screen -S minecraft

die dann wieder befestigt wird mit

screen -r minecraft

Antwort2

xargs wird das tun

$echo abc | xargs prog

Im obigen Beispiel führt xargs prog mit dem Argument abc aus, d. h. $prog abc

Ein anderes Beispiel

$ echo abc | xargs echo w x
w x abc

Antwort3

Vorausgesetzt, Sie verwenden Bash, können Sie auch Backticks verwenden. Soweit ich weiß, werden Backticks zuerst ausgewertet und das Ergebnis wird im Rest des Ausdrucks verwendet.

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

Ich denke, das sollte das bewirken, was Sie wollen.

Wie ein anderer Kommentator anmerkte, können Sie xargsauch verwenden, aber ich reserviere das lieber für Sachen mit mehreren Argumenten. Ich denke, dass Backticks für das, was Sie erreichen wollen, sauberer sind.

verwandte Informationen