現在は2つのコマンドがあり、build
手動で実行し、出力を直接目で分析し、出力で見つかった値を引数として使用します。プロセスは次のとおりです。deploy
build
deploy
$ 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-#を解析してデプロイに使用します。