환경 변수에서는 명령 대체가 작동하지 않습니다.

환경 변수에서는 명령 대체가 작동하지 않습니다.

이 명령이 있는데 이를 변경하고 싶습니다. 특히 환경 변수에 따라 최신 매개변수가 존재하기를 원합니다.

ansible-playbook --inventory inventories/ssg-dev deploy.yml --vault-id dev@~/ansible-password --skip-tags "clear-data"

내 시도는 다음과 같습니다.

ansible-playbook --inventory inventories/ssg-$ENVIRONMENT deploy.yml --vault-id $ENVIRONMENT@~/ansible-password $( [ $DATA_SCHEMAS_MIGRATION == true ] && echo ' --skip-tags "clear-data"')

환경 변수를 설정하고 echobefore를 사용하여 명령을 실행하여 출력을 확인하면 원래 명령과 정확히 동일합니다. 그러나 실행해 보면 인수가 전달되지 않는 것 같아서 명령 대체에서 환경 변수가 평가되지 않는다고 믿게 됩니다.

내 코드가 작동하지 않는 이유는 무엇이며 어떻게 해결할 수 있나요?

답변1

clear-data작은따옴표로 인해 주변의 큰따옴표는 평가되지 않습니다. 이는 예상했던 것과는 다른 "clear-data"주장 으로 이어집니다 .clear-data

이 시도:

ansible-playbook --inventory "inventories/ssg-$ENVIRONMENT" deploy.yml --vault-id "$ENVIRONMENT@~/ansible-password" $([ "$DATA_SCHEMAS_MIGRATION" = true ] && echo '--skip-tags clear-data')

$ENVIRONMENT글로빙(globbing)과 단어 분리를 방지하기 위해 큰따옴표도 추가했습니다 $DATA_SCHEMAS_MIGRATION.

답변2

변수로부터 명령줄을 구성할 때는 배열을 사용하는 것이 가장 좋습니다. 이는 스칼라 변수를 사용하려고 할 때 직면하게 되는 작은따옴표, 큰따옴표 및 따옴표가 없는 변수를 사용하고 결합하는 것과 관련된 거의 모든 토큰화 문제 및 기타 번거로움을 제거합니다.

배열을 사용하면 코드가 더 명확하고 읽기 쉽고 수정하기 쉬워집니다. 매개 변수와 조건이 많은 길고 복잡한 줄을 수정하는 대신 각 줄에 하나 이상의 매개 변수를 추가하여 여러 줄로 나눌 수 있습니다. )

명령과 함께 사용하려는 모든 매개변수가 포함된 배열을 구축하고(한 번에 모두 수행할 수도 있고, 추가로 수행할 수도 있고 +=, 원하는 경우 조건 및/또는 루프를 사용할 수도 있음) 다음을 사용하여 명령을 실행합니다. 배열의 모든 요소를 ​​인수로 사용합니다.

예를 들어:

ap_args=(--inventory "inventories/ssg-$ENVIRONMENT" deploy.yml)
ap_args+=(--vault-id "$ENVIRONMENT@~/ansible-password")
[ "$DATA_SCHEMAS_MIGRATION" == true ] && ap_args+=(--skip-tags clear-data)

ansible-playbook "${ap_args[@]}"

또한 변수를 인용하는 것을 잊지 마십시오. 바라보다공백이나 기타 특수 문자 때문에 쉘 스크립트가 멈추는 이유는 무엇입니까?그리고$VAR 대 ${VAR} 및 인용 여부

당신은 또한 볼 수 있습니다변수에 저장된 명령을 어떻게 실행할 수 있나요?

참고: 어레이에는 이를 지원하는 bash, ksh, 또는 기타 셸이 필요합니다. zshPOSIX sh(예: ash/ dash)는 그렇지 않습니다.

관련 정보