Stdout'u program argümanına yönlendirmek


2

Arch Linux dizüstü bilgisayarımda Minecraft sunucusu kullanıyorum. Minecraft için sunucu yazılımı bir komut satırında etkileşimli bir program olarak çalışır, bu yüzden ayrı bir ekran oturumunda başlatıyorum, erişmem gereken her seferinde yeniden bağlamama izin veriyor.

Bunu yapmak için bir komut dosyası kullandım (ekranı başka bir zaman kullanmıyorum, bu yüzden "grep SCREEN" hakkında endişelenmeyin)

#!/bin/bash

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

sudo screen -r $PID

Bu, sunucunun çalıştığı ekran oturumunun PID'sini alır ve ardından bu ekrana yeniden bağlanır.

Şimdi merak ediyorum, bunu hiçbir yerde bulamadığım için, çıkışını yönlendirmek için bir liner kullanabilirsem

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

doğrudan $ argümanına

sudo screen -r $argument

2 satıra gerek kalmadan

Temelde awk stdout'unu ekran stdin yerine ekranın argümanına yönlendirmek istiyorum .

Bu bulmak ve yapmak nispeten kolay olmalı gibi görünüyor, ancak Google’da bir şey bulmakta zorlanıyorum.

Herhangi bir yardım takdir! teşekkür ederim


Bu sorunun cevapları işe yaramalı.
Bob

Yanıtlar:


6

Bunun yerine, ps aux | grep SCREEN | sed -n 1p | awk '{ print $2; }'sadece yapabilir

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

Veya kurarsanız daha da fazlası önerilir procps:

pgrep SCREEN

(Bu komutları açıklandığı gibi geri tepmelere sarın veya $()okunması ve iç içe geçmesi daha kolay olan ve aynı şeyi yapan yapıyı kullanın .)

Veya dahası tavsiye edilir: Çalışan yalnızca bir Ekran oturumunuz varsa, basitçe:

screen -r

varsayılan olarak yalnızca mevcut oturuma eklenecektir.


Bir yorumda belirtildiği gibi: Gelecekte birden fazla Ekran oturumu çalıştırmak istiyorsanız, oturum adlandırma özelliğini kullanın. İle adlandırılmış bir oturum başlat

screen -S minecraft

sonra tekrar takılır

screen -r minecraft

1
Son noktanı okuduğumda neredeyse ölüyordum, bu yüzden man sayfaları okumalıyım ... ayrıca metin işleme programlarında daha fazla okumaya ihtiyacım var
Joe Bentley

1
Mükemmel cevap! OP'nin screengelecekte kullanmaya başlamasına karar vermesi durumunda, ekran oturumuna anlamlı bir isim vermek daha da iyi olacağını düşünüyorum . Ekran adı ilk başlatıldığında verilir, daha sonra şu şekilde tekrar bağlamak için kullanılabilir: screen -r <NAME>(köşeli çift ayraçlar olmadan).
orryowr

@ ryanrhee90: Çok doğru, ben bu yazıyı yazıma ekliyorum.
Daniel Andersson

1
@JoeBentley: Bu, kendi sorunlarınız için iyi bir cevap screen. Bununla birlikte, sorunuzun başlığına bakarsanız , yalnızca diğer iki cevap genel olarak uygulanabilir.
DevSolar

@DevSolar: Hem evet hem de hayır; ilk bölüm PID'yi almanın daha kısa yollarını ve backtick'leri açıklar $(). Ama evet: bu gerçekten sorulan şey olmamakla ilgili gerçek sorunun bir örneğidir , bu nedenle özel olarak Ekranı ilgilendirmek için (konunun muhtemelen yeterli olacağı) soruyu yeniden biçimlendirmek daha iyi olacaktır (diğer cevaplar yine de ardışık olmalıdır), veya Ekran referanslarını kaldırın ve Bash sorusu yapın. Ancak son yaklaşım aslında sorgulayıcının peşinde olduğu şey olmayacaktı ve bir nevi bağlantılı post'un bir kopyası olacaktı.
Daniel Andersson

13

xargs bunu yapacak

$echo abc | xargs prog

Yukarıdakilerde, xargs arg abc ie ile prog yürütecektir. $prog abc

Başka bir örnek

$ echo abc | xargs echo w x
w x abc

Ayrıca iyi bir cevap! Çok teşekkür ederim, diğer öneri için biraz daha kolay olduğu için gittim
Joe Bentley

4

Bash olduğunuzu varsayarak, başka bir yol backticks kullanmaktır. AFAIK, geri tepmeler önce değerlendirilir ve sonuç ifadenin geri kalanında kullanılır.

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

Bence istediğini yapmalısın.

Başka bir yorumcunun da belirttiği gibi, siz de kullanabilirsiniz xargs, ancak bunu çok argümanlı şeyler için ayırmayı seviyorum. Geri tepmelerin başarmak istediğin şey için daha temiz olduğunu hissediyorum.


Çok güzel teşekkür ederim, ps de arka sıralarda olmalı!
Joe Bentley,

1
İyi yakaladım, cevabı düzelttim. :) Teşekkürler.
orryowr

1
Bunları $(prgm)yuvalamak istiyorsanız da kullanabilirsiniz (Cennet bakımcısına yardım eder ...)
Christian Mann
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.