2

bash で自分のプログラム (gollum) を起動し、stderr の一部 (ポート番号) を別のプログラムの引数として使用したいと考えています。stderr を stdout にリダイレクトし、grep と sed を使用して出力をフィルタリングします。私は標準出力で結果を取得します:

gollum -p0 2>&1|  sed  -n -e "s/.*port=//p"

gollum はサーバーであるため、「56343」を返し、実行を続けます。

ただし、これを別のプログラムの引数として使用したい場合 (つまり、echo ですが、後でポート番号でインターネット ナビゲーターを起動するために使用したい場合)、xargs では機能しません。

gollum -p0 2>&1|  sed  -n -e "s/.*port=//p" | xargs -n1  echo  

何も起こりません。理由を知っていますか、それとも同じことをする別のアイデアがありますか。

ご協力ありがとうございました。

4

1 に答える 1

2

サーバーをバックグラウンドで実行し続けたくない場合、これは簡単に実行できます。その場合、1 つのアプローチはプロセス置換を使用することです。

#!/bin/bash
#      ^^^^- not /bin/sh; needed for >(...) syntax

gollum -p0 > >(
  while IFS= read -r line; do
    # start a web browser here, etc.
    [[ $line = *"port="* ]] && echo "${line##*port=}"
    # ...for instance, could also be:
    # open "http://localhost:${line##*port=}/"
  done
) 2>&1 &

... を含む最初の行のみを読み取りたい場合port=break、ハンドラーのループから抜け出し、終了する前に stdin の残りを処理します (これは を使用するのと同じくらい簡単cat >/dev/nullです)。

于 2016-09-29T22:46:33.570 に答える