백슬래시 이스케이프를 사용하여 인용된 문자열의 명령 대체

백슬래시 이스케이프를 사용하여 인용된 문자열의 명령 대체

다음과 같이 백슬래시 이스케이프와 함께 큰따옴표 명령 대체를 사용하는 것을 고려하십시오.

echo "$(echo '\\')"

그것은 인쇄되지만 \\나는 백슬래시만 인쇄할 것으로 예상했습니다. 내 생각은 (잘못된) 전체 문자열을 통과하고 모든 백슬래시 이스케이프를 대체하고그 다음에명령 대체를 수행합니다. 물론 순서는 반대입니다.

하지만 만약 우리가 그렇게 한다면

echo "$(echo '\')$"

로 인쇄됩니다 \$. 명령 대체를 수행하는 경우첫 번째그런 다음 해당 문자열은 백슬래시 이스케이프에 대해 평가되며 결국 \에는 $단일로 결합될 수 있습니다. $그러나 그것은 진실이 아니다.

백슬래시 이스케이프는 사물의 순서에서 어디에 적합합니까?

(이 질문의 배경은 sed 명령에 삽입하기 위해 문자열의 정규식 문자를 올바르게 이스케이프 처리하는 방법을 연구하고 있다는 것입니다.)

답변1

echo $(echo '\\')나는 그것이 (즉, 외부 따옴표가 없는 변형)의 출력으로 가장 잘 이해된다고 생각하며 , 그 결과는 \\.리터럴 문자열$(...)엔터티를 바꿀 때 백슬래시의 확장 명령 해석입니다. (이는 이스케이프 문자를 문자열에 저장하는 것과 유사하며 리터럴 문자열로 재해석되지 않습니다.)

답변2

구분된 명령 대체에서 $(…)대괄호 안의 내용은 최상위 명령과 동일한 방식으로 구문 분석됩니다(균형이 맞지 않는 닫는 대괄호와 관련된 일부 특수한 경우 제외). 괄호 안에는 추가 백슬래시 확장이 없는 일반 쉘 조각이 있습니다.

이 명령은 echo '\\'두 개의 백슬래시와 한 개의 줄바꿈( echo명령이 백슬래시 확장을 수행하지 않는다고 가정)의 세 문자를 인쇄합니다. 따라서 명령 대체의 결과 $(echo '\\')는 2문자 문자열입니다 \\(명령 대체가 항상 그렇듯이 마지막 개행 문자는 제거됩니다). 큰따옴표 안에 명령 대체를 사용했기 때문에 추가 확장이 수행되지 않습니다. 결과 단어 부분은 입니다 \\.

에서 echo "$(echo '\')$"명령 대체는 백슬래시를 출력합니다. 인수에 대한 기여 echo는 string 입니다 \. 다음 문자는 $매개변수 이름의 시작 문자로 사용할 수 없으므로 매개변수 이름 자체로 확장됩니다. 따라서 echo에 대한 인수는 두 문자 string 입니다 \$. 큰따옴표로 묶인 문자열은 더 이상 확장되지 않으며 백슬래시를 특수 문자로 해석할 수 있는 것은 없습니다(명령의 특정 특징 제외 echo).

가독성이 다양한 전체 확장 규칙은 쉘 매뉴얼과 기타 문서에서 찾을 수 있습니다. 이것POSIX 사양기준으로는 나쁘지 않습니다(미미한 칭찬).

폴리스티렌"sed" 대체에 삽입된 문자열이 모든 메타 문자를 이스케이프하는지 확인하는 방법

답변3

인용과 더 많은 관련이 있습니다.

$ echo '\'
\
$ echo '\\'
\\
$ echo "\\"
\

작은따옴표를 사용하면 따옴표 사이에 있는 내용이 모두 에코됩니다. 큰따옴표를 사용하면 쉘이 내부를 살펴보고 처리합니다.

관련 정보