Перенаправление stdout в аргумент программы

Перенаправление stdout в аргумент программы

Я запускаю сервер Minecraft на своем ноутбуке Arch Linux. Серверное программное обеспечение для Minecraft работает как интерактивная программа в командной строке, поэтому я запускаю его в сеансе отсоединенного экрана, что позволяет мне подключаться заново каждый раз, когда мне нужно получить к нему доступ.

Для этого я использовал скрипт (я не использую screen в других случаях, так что не беспокойтесь о "grep SCREEN")

#!/bin/bash

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

sudo screen -r $PID

Это позволит получить PID сеанса экрана, в котором работает сервер, а затем повторно подключиться к этому экрану.

Теперь мне интересно, поскольку я не могу найти это нигде, могу ли я использовать однострочный код для перенаправления вывода

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

напрямую к $argument в

sudo screen -r $argument

без необходимости занимать 2 строки

По сути, я хочу перенаправить стандартный вывод awk варгументэкрана, а не как стандартный ввод экрана.

Кажется, это должно быть относительно легко найти и сделать, но у меня возникли большие проблемы с поиском информации об этом в Google.

Любая помощь приветствуется! Спасибо

решение1

Вместо этого ps aux | grep SCREEN | sed -n 1p | awk '{ print $2; }'вы могли бы просто сделать

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

Или, что еще более рекомендуется, если вы установите procps:

pgrep SCREEN

(Заключите эти команды в обратные кавычки, как объяснено, или используйте $()конструкцию, которую легче читать и вкладывать, и которая делает то же самое.)

Или дажеболеерекомендуется: если у вас запущен только один сеанс Screen, просто:

screen -r

по умолчанию будет присоединен к единственному существующему сеансу.


Как отмечено в комментарии: если вы, возможно, захотите запустить несколько сеансов Screen в будущем, используйте возможность именования сеансов. Начните именованный сеанс с помощью

screen -S minecraft

который затем снова прикрепляется с помощью

screen -r minecraft

решение2

xargs сделает это

$echo abc | xargs prog

В приведенном выше примере xargs выполнит prog с аргументом abc, т.е. $prog abc

Другой пример

$ echo abc | xargs echo w x
w x abc

решение3

Если вы используете bash, то другой способ — использовать обратные кавычки. Насколько мне известно, обратные кавычки вычисляются первыми, а результат используется в остальной части выражения.

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

Я думаю, это должно сделать то, что вам нужно.

Как указал другой комментатор, вы можете использовать xargsтакже, но я предпочитаю приберечь это для многоаргументных вещей. Я считаю, что обратные кавычки чище для того, чего вы хотите добиться.

Связанный контент