~에 따르면POSIX 셸 명령 언어 페이지:
\
<backslash>
이스케이프 문자로서의 특별한 의미는 뒤에 다음 문자 중 하나가 오는 경우에만 유지되어야 합니다(이스케이프 문자(백슬래시) 참조).특별하다고 생각될 때:
$
`
"
\
<newline>
이는 백슬래시를 사용하여 이 5개 문자를 이스케이프하면 해당 문자를 이스케이프하는 효과가 없으며 "특별"하지 않은 경우 문자 그대로 처리하지 않음을 의미하는 것 같습니다.
이것을 올바르게 해석하고 있습니까? 그렇다면 \
이 5개의 특수 문자 중 하나를 a로 이스케이프 처리하면 의도한 이스케이프 효과가 발생하지 않는 경우가 있습니까?
답변1
@MichaelHomer가 이에 대해 설명합니다.매우 좋은. 실제 사례를 시도해 보겠습니다 PS1='\$ '
.
$ echo "$ at start"
$ at start
$ echo "at end $"
at end $
$ echo "$before"
$ echo "after$"
after$
따라서 $
단어 앞에 "special"만 붙이면 됩니다.매개변수 대체. 이 모든 항목 앞에 백슬래시를 추가하면 어떻게 되나요?
$ echo "\$ at start"
$ at start
$ echo "at end \$"
at end $
$ echo "\$before"
$before
$ echo "after\$"
after$
"특수" 줄만 변경되었습니다. 이제 달러 기호는 문자 그대로 처리됩니다. 그것은언제나문자 그대로 받아들였습니다. 다른 캐릭터들은 어떻게 되나요?
$ echo "\ at start"
\ at start
$ echo "at end \"
> ^C
$ echo "\before"
\before
$ echo "after\"
> ^C
따라서 백슬래시는 특수 문자가 아닌 문자 앞에 있는 또 다른 리터럴 문자입니다. (^C는 인용 문자가 이스케이프 처리되었기 때문에 명령줄을 취소해야 하는 곳입니다.)
답변2
예를 들어 문자는 $
특별한 의미를 가지며 문자 그대로 데이터의 일부가 되는 것 이상의 영향을 미칠 때 특별한 것으로 간주됩니다. 에서는 $x
매개 $
변수 확장이 특별한 의미로 도입되었습니다.
이 구절이 의미하는 바는 백슬래시가 이스케이프 문자라는 고유한 의미를 갖는다는 것입니다.오직특별한 의미를 지닌 이러한 문자 중 하나 앞에 올 때. 일반적으로,백슬래시는 더 넓은 이스케이프 의미를 갖습니다.:
따옴표가 없는 <backslash>는 <newline>을 제외한 후속 문자의 리터럴 값을 유지합니다.
예를 들어 "\$x"
문자열 "$x" "a\ b"
대신 . 두 번째 경우의 백슬래시가 목록에 없는 문자 앞에 오고 따라서 특별한 의미가 없기 때문입니다. 그러나 큰따옴표 외부에는 a\ b
문자열 "ab"가 있고 백슬래시로 인해 공백이 문자 그대로 포함되며 백슬래시 자체가 제거됩니다.
당신이 인용한 구절가끔 그런 캐릭터는 아니지만유지하다특별한 의미를 벗어났음에도 불구하고, 그러나 백슬래시는 그 중 하나에 영향을 주지 않는 한 특별한 의미가 없습니다.
여기에 잠재적인 매달려 수정자가 있습니다: 예수치특별하다고 생각되거나백슬래시?
큰따옴표 안의 특정 문자에 특별한 의미가 없을 수 있는 잠재적인 경우가 있습니다.당신이 인용한 지점 바로 앞의 지점, 그러나 또한여기서 문서 구분 기호로. 그러나 내장된 확장 프로그램에는 이 문서 구분 기호와 같은 자체 인용 규칙이 있으므로 실제로 표시되는지 여부는 확실하지 않습니다. 백슬래시인 경우 이는 이중 백슬래시가 아무 것도 이스케이프하지 않는다는 의미일 뿐입니다.
내가 아는 가장 좋은 점은 문자를 제한하면 다음 문서 구분 기호를 얻을 수 있다는 것입니다.
cat <<"A$B"
A$B
cat <<"A\$B"
A$B
이 두 가지는 내 모든 쉘에서 동일한 작업을 수행합니다. $
처음에는 구분 기호에 포함되었으므로 특별하지는 않지만 두 \
번째 내부 큰따옴표는 이스케이프 처리해서는 안 되며 문자 그대로 포함되어야 합니다. 나는 이것이 요구되는 행동인지는 확실하지 않다고 생각하지만, 이는 법의 조항 내에 있는 것 같습니다.
포함된 확장의 경우 $(...)
따옴표 효과(두 종류 모두)를 거부하거나 자체 인용 규칙이 있고 무언가(다양한 ${...}
및 ` ... `
)를 인용하는 고유한 방법이 없으며 아직 명시적인 항목을 구성하지 못했습니다. -특수하지 않은 백슬래시가 앞에 오는 이러한 문자 중 하나의 특수 버전입니다.
굵은 글씨가 현재 중복된 것 같습니다. 잠재적인 매달려 있는 수정자는 적어도 이를 모호하게 만듭니다. 어쩌면 정오표나 다음 업데이트로 제출해야 하는 문구 오류일 수도 있습니다.
답변3
그것을 단순화하려고 노력합시다.
텍스트는 다음과 같습니다.
<백슬래시>는 뒤에 다음 문자 중 하나가 오는 경우 특수 문자로 처리되는 경우에만 이스케이프 문자로서의 특별한 의미를 유지해야 합니다(이스케이프 문자(백슬래시) 참조).
우리는 그것의 일부를 변환할 수 있습니다:
<백슬래시> ==>두번째
...이스케이프 문자라는 특별한 의미를 유지해야 합니다
... \__________/---------\______/
==> 그래도 그렇습니다--- ---------------- 이스케이프 문자
==>는 여전히 이스케이프 문자입니다.있는 그대로연합 국가- 인용된 문자열.
... 오직
...다음 문자 중 하나가 뒤에 오는 경우 ==> A두번째[$`"\ 앞에네덜란드]
...특별하다고 생각되는 경우
그런 다음 1,2,4는 다음과 같습니다. 두번째여전히 [$`"\ 이전의 탈출네덜란드]
논란이 되는 부분은 다음과 같습니다.특별하다고 생각될 때
존재란 무엇인가특별하다고 생각되는?
>>"캐릭터"<<라고 생각합니다. 작성된 대로:
특수한 것으로 간주되는 경우 다음 문자 중 하나:
Q: 예: 언제
"
특별합니까(큰따옴표로 묶음)?대답: 항상(와 같은 중첩 구조에 관계없이
echo "$(sed 's/["]//' file)"
).따라서 백슬래시는 항상
"
:(echo "a\"b\"b\""
다시 말하지만 중첩 구조가 없음)을 인용합니다.그런 다음 1,2,3,4 및 5는 다음과 같아야 합니다.
두번째아직 탈출구야오직앞으로특별한[$`"\네덜란드]
따라서 귀하의 질문에 대답하려면 다음을 수행하십시오.
```, or 를
\
피할 수 없는 상황이 있나요 ?$
"
\
<newline>
예: 예, [$`"\ 문자가 있는 경우네덜란드] 특별하지 않아요.
그들(캐릭터)은 아마도특별하지 않은예를 들어 중첩된 구조 내에 있지만 따옴표 안에 있습니다.