ENV 변수를 저장하기 위해 CircleCi 상자를 사용하려고 합니다. 나는 보통 이렇게 합니다:
echo 'export FILE=$(ls bin | head -n 1)' >> $BASH_ENV
이는 간단한 명령에 적합하며 $BASH_ENV에 출력을 생성합니다.
export FILE=$(ls bin | head -n 1)
이제 한 번만 실행하면 되는 확장 명령의 경우 이는 복잡하고 작동하지 않습니다.
echo 'export INSTANCE_ID=$(aws ec2 run-instances --instance-type t3.large\
--image-id $AMI --key-name circleci-key --count 1 --security-group-ids $SG\
--subnet-id $SUBNET --network-interfaces "{\"AssociatePublicIpAddress\": true, \"DeviceIndex\": 0, \"SubnetId\": \"$SUBNET\", \"Groups\": [\"$SG\"]}"\
--tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=instance-from-circleci}]'\
| jq '.Instances[0].InstanceId' --raw-output)' >> $BASH_ENV
이 코드는 $BASH_ENV 에 추가되면 실행될 때마다 실행됩니다 source $BASH_ENV
.
이 값을 변수에 저장한 다음 이미 최종 형식인 에코된 줄에 추가하는 방법이 있습니까?
그것은 다음과 같습니다:
echo 'export $INSTANCE_ID' >> $BASH_ENV
답변1
따옴표를 이스케이프 처리하는 번거로움을 피하려면 다음 문서를 사용하는 것이 더 쉽습니다.
cat << 'EOF' >> "$BASH_ENV"
export INSTANCE_ID="$(
aws ec2 run-instances \
--instance-type t3.large \
--image-id "$AMI" \
--key-name circleci-key \
--count 1 \
--security-group-ids "$SG" \
--subnet-id "$SUBNET" \
--network-interfaces '
{
"AssociatePublicIpAddress": true,
"DeviceIndex": 0,
"SubnetId": "'"$SUBNET"'",
"Groups": ["'"$SG"'"]
}' \
--tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=instance-from-circleci}]' |
jq '.Instances[0].InstanceId' --raw-output)"
EOF
(또한 누락된 따옴표를 수정하고 가독성을 향상시킵니다.)
EOF
( ) 주위의 따옴표가 'EOF'
중요합니다. 이것이 없으면 이 문서의 변수 및 명령 대체가 확장되고 \
이 문서를 생성할 때 꼬리 부분이 줄 연속으로 처리됩니다.
답변2
이제 한 번만 실행하면 되는 확장 명령의 경우 [...] 이 값을 변수에 저장한 다음 이미 최종 형식인 에코 라인에 추가하는 방법이 있습니까?
기본적으로 섹션을 $BASH_ENV로 인쇄하는 대신 var=$(command...)
스크립트 자체에서 명령 대체를 실행한 다음 결과를 인쇄합니다. 그래서:
var=$(some command)
echo "var='$var'" >> file
그러나 이것은 var='value'
쉘의 인용 등을 거치게 되므로 값에 작은따옴표가 포함될 수 있으면 깨질 것입니다.
대신 printf %q
Bash에서 예를 들어 다음을 사용할 수 있습니다.
var=$(some command)
printf "var=%q\n" "$var" >> file
예 를 들어 값이 $var
다음과 같은 경우 it ain't so
생성됩니다 . var=var=it\ ain\'t\ so
보기 흉하지만 실행 시 동일한 값을 생성합니다.