각 줄이 다음과 같은 여러 열로 구성된 bash 스크립트에서 파일을 읽고 있습니다.
ANSIBLE 'first run' '--diff --extra-vars "client=yes fast=no"'
보시다시피 행은 아포스트로피 안에 공백이 있는 세 개의 열로 구성됩니다. 세 번째 열에는 호출할 바이너리에 대한 옵션이 포함되어 있습니다. 파일을 읽을 때 다음 옵션을 변수에 저장합니다.
custom_options=${columns[2]}
이는 다음과 같이 평가됩니다.
custom_options='--diff --extra-vars "client=yes fast=no"'
이제 다음 옵션을 사용하여 바이너리를 실행하고 싶습니다.
ansible-playbook $custom_options site.yml
그러나 실행 시 내부 문자열 주위에 아포스트로피가 추가되기 때문에 실패합니다.
ansible-playbook --diff --extra-vars '"client=yes fast=no"' site.yml
변수 문자열을 그대로 바꾸는 방법을 아는 사람이 있습니까?
다음은 동작을 빠르게 재현하기 위한 짧은 스크립트입니다.
#!/bin/bash
set -x
touch "as is"
command='-name "as is"'
find . $command -type f
답변1
해결책이 아닌 해결책을 찾았습니다. 전체 명령을 표현식 내부의 변수로 묶었습니다 eval
.
eval "ansible-playbook $custom_options site.yml"
다음은 예제 스크립트의 동등한 사용법입니다.
...
eval "find . $command -type f"
저는 bash 전문가가 아니며 이 해결 방법에 부작용이 있는지 모르겠습니다. 그럼에도 불구하고 다음을 테스트했습니다.
- eval은 파이프에서 작동합니다.
eval "command | tee file"
- eval 내부에 따옴표를 붙일 수 있습니다:
eval "command \"${var}\""
내 요구 사항에는 맞았지만 더러운 느낌이 들었습니다. 더 나은 솔루션을 환영합니다.