현재 는 두 개의 명령을 가지고 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
실제로는포장기, 정통한 사람을 위해)
이 두 단계를 하나의 스크립트로 결합하고 싶습니다. 대략적인 개요에는 다음이 포함됩니다.
- 달리기
build
0
종료 상태가 다음과 같고 출력에 "AMIs was Created"라는 문자열이 포함되어 있는지 확인하고 , 그렇지 않으면 중단하십시오.ami-19601070
출력()에서 AMI 번호 추출- 달리기
deploy ami-19601070
가급적이면 쉘 스크립트를 사용하여 모든 것을 함께 연결하는 가장 좋은 방법을 찾으려고 노력하고 있지만 이상적으로는 모든 stdout/stderr 메시지를 터미널로 스트리밍하면서 두 개의 개별 패턴의 출력을 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-#을 구문 분석하여 배포에 사용합니다.