
Я запускаю сервер 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
также, но я предпочитаю приберечь это для многоаргументных вещей. Я считаю, что обратные кавычки чище для того, чего вы хотите добиться.