나는 bash 가 "$<var>"
단순히 . 다음 상호 작용을 고려하십시오.$<var>
<var>
1: $ X="A; B"
2: $ printf "%s\n" $X
3: A;
4: B
5: $ printf "%s\n" "A; B"
6: A; B
7: $ printf "%s\n" A; B
8: A
9: B: command not found
보시다시피, 2행의 출력은 5행의 출력과 다르므로 이 경우의 확장은 $X
단순한 텍스트 대체가 아닙니다. 큰따옴표(7행)를 제거해도 아무런 효과가 없습니다.
bash가 이러한 상황을 정확히 어떻게 처리하는지 설명할 수 있나요?
답변1
인용하지 않았기 때문에 $X
말로 표현되었을 수도 있습니다. 2행에서 실행된 명령은 다음과 같습니다.
printf '%s\n' 'A;' B
쉘 은 ;
이스케이프되지만 공백은 이스케이프되지 않습니다. 이는 7행의 명령과 다릅니다.
$ printf "%s\n" A; B
이스케이프되지 않기 때문에 ;
명령 구분 기호 역할을 합니다. 즉, 다음 명령은 B
명령이 아닌 이므로 명령을 찾을 수 없다는 오류가 발생합니다.
5행은 큰따옴표로 인해 예상대로 작동하며, 2행에도 큰따옴표가 필요합니다. 단어 분할을 방지합니다. 원하는 명령은 다음과 같습니다.
printf "%s\n" "$X"