stdout をプログラム引数にリダイレクトする

stdout をプログラム引数にリダイレクトする

私は Arch Linux ラップトップで Minecraft サーバーを実行しています。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のstdoutを口論画面の標準入力としてではなく、画面の stdin として。

これは比較的簡単に見つけて実行できるように思えますが、Google でこれに関する情報を見つけるのに苦労しています。

ご協力いただければ幸いです。ありがとうございます

答え1

の代わりにps aux | grep SCREEN | sed -n 1p | awk '{ print $2; }'、次のようにすることもできます。

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

または、以下をインストールするとさらに推奨されますprocps:

pgrep SCREEN

(説明されているように、これらのコマンドをバックティックで囲むか、$()読みやすくネストしやすく、同じことを実行する構造を使用します。)

あるいはもっと推奨: 実行中の Screen セッションが 1 つだけの場合は、次のようにします。

screen -r

デフォルトでは、存在する唯一のセッションに接続されます。


コメントにもあるように、将来的に複数のScreenセッションを実行したい場合は、セッション名付け機能を使用してください。名前付きセッションを開始するには、

screen -S minecraft

その後、

screen -r minecraft

答え2

xargsはそれを実行します

$echo abc | xargs prog

上記では、xargsは引数abcでprogを実行します。 $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も使用できますが、これは複数の引数を扱う場合に限って使用しています。 バックティックの方が目的を達成するのにわかりやすいと思います。

関連情報