다음과 같이 백슬래시 이스케이프와 함께 큰따옴표 명령 대체를 사용하는 것을 고려하십시오.
echo "$(echo '\\')"
그것은 인쇄되지만 \\
나는 백슬래시만 인쇄할 것으로 예상했습니다. 내 생각은 (잘못된) 전체 문자열을 통과하고 모든 백슬래시 이스케이프를 대체하고그 다음에명령 대체를 수행합니다. 물론 순서는 반대입니다.
하지만 만약 우리가 그렇게 한다면
echo "$(echo '\')$"
로 인쇄됩니다 \$
. 명령 대체를 수행하는 경우첫 번째그런 다음 해당 문자열은 백슬래시 이스케이프에 대해 평가되며 결국 \
에는 $
단일로 결합될 수 있습니다. $
그러나 그것은 진실이 아니다.
백슬래시 이스케이프는 사물의 순서에서 어디에 적합합니까?
(이 질문의 배경은 sed 명령에 삽입하기 위해 문자열의 정규식 문자를 올바르게 이스케이프 처리하는 방법을 연구하고 있다는 것입니다.)
답변1
echo $(echo '\\')
나는 그것이 (즉, 외부 따옴표가 없는 변형)의 출력으로 가장 잘 이해된다고 생각하며 , 그 결과는 \\
.리터럴 문자열$(...)
엔터티를 바꿀 때 백슬래시의 확장 명령 해석입니다. (이는 이스케이프 문자를 문자열에 저장하는 것과 유사하며 리터럴 문자열로 재해석되지 않습니다.)
답변2
구분된 명령 대체에서 $(…)
대괄호 안의 내용은 최상위 명령과 동일한 방식으로 구문 분석됩니다(균형이 맞지 않는 닫는 대괄호와 관련된 일부 특수한 경우 제외). 괄호 안에는 추가 백슬래시 확장이 없는 일반 쉘 조각이 있습니다.
이 명령은 echo '\\'
두 개의 백슬래시와 한 개의 줄바꿈( echo
명령이 백슬래시 확장을 수행하지 않는다고 가정)의 세 문자를 인쇄합니다. 따라서 명령 대체의 결과 $(echo '\\')
는 2문자 문자열입니다 \\
(명령 대체가 항상 그렇듯이 마지막 개행 문자는 제거됩니다). 큰따옴표 안에 명령 대체를 사용했기 때문에 추가 확장이 수행되지 않습니다. 결과 단어 부분은 입니다 \\
.
에서 echo "$(echo '\')$"
명령 대체는 백슬래시를 출력합니다. 인수에 대한 기여 echo
는 string 입니다 \
. 다음 문자는 $
매개변수 이름의 시작 문자로 사용할 수 없으므로 매개변수 이름 자체로 확장됩니다. 따라서 echo에 대한 인수는 두 문자 string 입니다 \$
. 큰따옴표로 묶인 문자열은 더 이상 확장되지 않으며 백슬래시를 특수 문자로 해석할 수 있는 것은 없습니다(명령의 특정 특징 제외 echo
).
가독성이 다양한 전체 확장 규칙은 쉘 매뉴얼과 기타 문서에서 찾을 수 있습니다. 이것POSIX 사양기준으로는 나쁘지 않습니다(미미한 칭찬).
답변3
인용과 더 많은 관련이 있습니다.
$ echo '\'
\
$ echo '\\'
\\
$ echo "\\"
\
작은따옴표를 사용하면 따옴표 사이에 있는 내용이 모두 에코됩니다. 큰따옴표를 사용하면 쉘이 내부를 살펴보고 처리합니다.