"bash -c" 내 하위 쉘의 변수를 구문 분석하는 방법은 무엇입니까?
아래에서 두 번째 하위 셸(내부에 "echo"가 있는 하위 셸)이 올바르게 구문 분석됩니다. "touch"를 사용하는 첫 번째 하위 쉘은 그렇지 않습니다.
/bin/bash -c "\
A=/tmp/foo; \
echo $( touch \$A; ); \
echo $( echo in subshell, \$A; ); \
"
답변1
그 이유는 간단합니다. 왜냐하면 서브쉘은 서브쉘이 아닌 현재 쉘에서 계산되기 때문입니다. 이스케이프하면 $()
예상대로 작동합니다.
/bin/bash -c "\
A=/tmp/foo; \
echo \$( touch \$A; ); \
echo \$( echo in subshell, \$A; ); \
"
답변2
큰따옴표를 사용하기 때문에 Bash는 먼저 전체 문자열을 평가한 다음 실행합니다.
첫 번째 줄을 다음과 같이 바꾸면 실행하려는 코드가 /bin/bash -c echo “\
다음과 같이 표시됩니다 .bash -c
/bin/bash -c echo "\
…
touch \$A; ); echo $( echo in subshell, \$A; ); "
echo in subshell, \$A; ); "
touch \$A; ); echo $( echo in subshell, \$A; );
touch \$A;
echo in subshell, \$A; );
echo in subshell, \$A;
대신 작은따옴표를 사용하세요.