すでに実行中のプロセスの出力を別の場所にリダイレクトすることを実際には意図していないことが議論から明らかになりました。しかし、開始しているプロセスの出力を変更しようとしているようです。
bash(使用していると思われる)を使用すると、[FD]>TARGET
resp。 [FD]<SOURCE
を使用して、プロセスのI/Oチャネルを指定します。 FD
はオプションで、ファイル記述子番号です。それを出すことは、<
と1
(= stdout)の0
(= stdin)が>
にあることを意味します。 (2
はstderrのよく知られたファイル記述子です)。 TARGET
またはSOURCE
私はファイルシステムオブジェクト(ファイル、デバイス、名前付きパイプ、unixドメインソケット)または&FD
です。ここで、FD
は再びファイル記述子番号であり、使用する(オープン)ファイル記述子を示します。
たとえば、2>&1
に書き込むことによって、stdoutがどこに行くのかにエラー出力が送られるようにします。
あなたが今のプロセスからの出力を後処理する場合(それはいくつかのコマンドおよびI/Oリダイレクションそれ自体からなる任意の複合体(シェル)文である可能性があるので、実際にこれはシェル用語ではパイプラインである。)あなたが使用する パイプ:(A | B
)。
これは基本的にプロセスAのstdoutをプロセスBのstdinに接続します。
他のunixコマンドまたはプログラムを使用することができます。最も一般的なのはsed
(正規表現ベースの置換を適用する場合)またはawk
です。他にもperl
またはpython
をお勧めします。
あなたの場合、環境変数で与えられた接頭辞を各行の先頭に追加します。
awk '{ print "'"$SOME_ENV_VAR"'|" $0;}'
やawkの変数などの外部値を渡す:少しさらにこれを取るために
awk -v var="$SOME_ENV_VAR" '{ print var "|" $0;}'
:
次のようにあなたはそれを書くことができawk
を使用して
bashによる出力リダイレクションは非常に強力です。たとえば、stdoutを1つのパイプに、sterrを別のパイプに渡すことができます。例えば:
(((echo hallo; echo ERROR >&2) | awk '{ print "stdout|" $0; }' >&4) 2>&1| awk '{ print "stderr: " $0;}') 4>&1
これは、別個のAWKインスタンスによってstdoutとsterrを処理し、シェルの通常の標準出力に(組み合わせ)出力を送ります。
出典
2016-04-27 16:09:28
rpy
まず、使用しているシェルの種類を述べる必要があります。 Linuxでは、bashを使用している可能性は非常に高いです。それから、_running processes_は、プロセスを開始してからI/O割り当てを変更しようとしていることを示唆しています - これは(少なくともカーネルを特別にサポートしなくては)不可能です。しかし、あなたの例では、プロセスの開始時にI/Oを明確にすることをお勧めします。最後に、達成したいと思うものについてもっと細かく説明しなければなりません。 sh(したがってbashも)は、プロセスのstin/stdout/stderrが互いにどのように接続できるかという点で非常に強力です。 – rpy
ありがとう、ちょうどそのawk '{print "$ SOME_ENV_VAR |" $ 0;} ''はenv変数をcathcしません。どのようにawkで環境変数を使用できますか? – AbtPst
これは 'awk'のプロパティではなく、' awk'スクリプトパラメータで一重引用符( '' ')を使用した結果です。例えば、 'awk '{print'" $ SOME_ENV_VAR | "'$ 0;}''を使用しました。しかし、これは単に '$ SOME_ENV_VAR'の値を' process'の各行の前に置いて、 '/ dev/null'を送るだけです。 – rpy