コマンドの解析中にコマンドの出力をどのように表示できますか?

コマンドの解析中にコマンドの出力をどのように表示できますか?

現在は2つのコマンドがあり、build手動で実行し、出力を直接目で分析し、出力で見つかった値を引数として使用します。プロセスは次のとおりです。deploybuilddeploy

$ build
==> amazon-ebs: amazon-ebs output will be in this color.
... hundreds of lines of output ...
==> Builds finished. The artifacts of successful builds are:
--> amazon-ebs: AMIs were created:
us-east-1: ami-19601070

$ deploy ami-19601070
... some more output ...

build実際には包装機、精通した人のために)

これら2つのステップを1つのスクリプトにまとめたいと思います。おおよその概要には以下が含まれます。

  • 走るbuild
  • 0終了ステータスが次のようになり、出力に「AMIs was Created」という文字列が含まれていることを確認し、それ以外の場合は中止します。
  • ami-19601070出力()からAMI番号を抽出する
  • 走るdeploy ami-19601070

可能であれば、シェルスクリプトを使用してすべてを一緒に接続するための最良の方法を見つけようとしていますが、理想的には、すべてのstdout / stderrメッセージを端末にストリーミングしながら、2つの別々のパターンの出力をgrepする方法に閉じ込められています。コマンドが実行されます。私はこれをシェルスクリプトで行うという考えを捨て、代わりにそれを実行するために小さなPythonスクリプトを書く必要があるかどうか疑問に思います。

答え1

仕事のようです。tee:

build | tee /some/file
ami_name=$(do_something_to /some/file)
deploy "$ami_name"

答え2

 deployArgs=`build | tee /dev/tty  | extractDeployArgs` &&
    deploy "$deployArgs" #won't run unless extractDeployArgs suceeded

tee /dev/tty端末に直接印刷し、同時に出力をパイプの次のコマンドにパイプします。

(このファイルを別のファイルに自由に置き換えます(または/dev/fd/"$someFileDescriptor"サイド出力をにリダイレクトする必要がある場合$someFileDescriptor))

アドバンストシェル(ksh、、bashしかしzshは該当しませんdash)では、set -o pipefailリンクのいずれかが失敗した場合にパイプが失敗することを保証できます(入力がextractDeployArgs成功buildを確認できない場合は便利です)。

答え3

tf=$(mktemp)
build | tee "$tf"
grep -Fq 'AMIs were created' "$tf" && ami=$(grep -o 'ami-[0-9]\+$' "$tf")

# you didn't say if `deploy` can handle multiple args or not.
# uncomment one of the following:
# deploy $ami
# for a in $ami ; do deploy "$a" ; done

答え4

特定の出力文字列に興味がある場合は、次のように実行できます。

msg="$(build | grep -e "AMIs were created\|ami-[0-9]*")"

if [ -n "$(echo $msg | grep -e "AMIs were created")" ];then
    ami="$(echo "$msg" | grep -e "ami-[0-9]*" | cut -d ' ' -f 2)"
    deploy "$ami"
else
    exit 1
fi

最初のgrepは、出力でAMIが作成されたことを報告する行またはami-#のみを選択します。 「AMI Created」出力を確認し、存在する場合は関連出力からami-#を解析してデプロイに使用します。

関連情報