~에 따르면POSIX 셸 명령 언어 페이지:
\
<backslash>
이스케이프 문자로서의 특별한 의미는 뒤에 다음 문자 중 하나가 오는 경우에만 유지되어야 합니다(이스케이프 문자(백슬래시) 참조).특별하다고 생각될 때:
$
`
"
\
<newline>
나는 이것을 5개의 특수 문자 중 하나만 이스케이프해야 한다는 의미로 해석합니다 \
(주어진 컨텍스트에서 특수 문자인 경우).
ash, dash, bash 및 ksh의 매뉴얼 페이지에는 "특별하다고 간주되는 경우" 절이 포함되어 있지 않습니다. 나는 이것이 \
5개의 문자 중 하나가 주어진 맥락에서 특별하지 않더라도 이 5개의 문자를 무조건 이스케이프하는 효과를 갖는다는 의미(그리고 기본 실험에 의해 확인된)라고 생각합니다 .
고려된 출력 $ printf '%s\n' "\abcde"
, \abcde
즉 이는 a
이 경우(또는 해당 문제에 대한 모든 경우) 특별하지 않기 때문에 예상되는 것이므로 \
특별하지 않고 문자 그대로 처리됩니다.
이제 출력을 고려 $ printf '%s\n' "\\abcde"
하십시오 \abcde
. 이것은 내가 기대하는 동작이 아닙니다. 제가 보기에는 문자열의 첫 번째 백슬래시 \\abcde
도 문자 그대로 처리되어야 하는 것 같습니다 . 그 뒤에 오는 \
문맥상 \
특별하지 않기 때문입니다. 내가 원하는 출력은 \\abcde
.
예상치 못한 동작이 나타나는 또 다른 시나리오는 의 출력입니다 $ printf '%s\n' "ab\$"
. 즉, ab$
제 생각에는 $
이 경우 매개변수 확장, 명령 대체 또는 산술 확장을 도입하는 데 도움이 되므로 특별한 의미가 있습니다. 그러므로 내 생각에는 그것이 뒤따르는 문맥이 특별하지 않기 \
때문에 문자 그대로 받아들여야 한다고 생각한다 . 내가 원하는 출력은 .$
$
ab\$
기록을 위해, 나는 여기서 완전히 벗어났기를 바랍니다. 이로 인해 특정 상황에서만 이 다섯 글자를 탈출할 수 있을지 걱정해야 했기 때문에 내 삶이 훨씬 더 어려워졌습니다. 나는 가능한 한 정확하려고 노력하고 있으며 \
주류 POSIX 호환 셸에서 이 (개인적으로 원하는) 동작이 POSIX와 호환되지 않는 경우 이 5개의 특수 문자를 이스케이프 처리하는 데 무조건 의존하고 싶지 않습니다.
답변1
이 메모텍스트 삭제 제안특별하다고 생각될 때.
참고: 제안된 수정 사항 집합은 0000998에 제공됩니다..
또한 이 메모에는 변경 사항이 2012년 8월 30일에 승인되었다고 보고되어 있습니다.
왜 아직도 그런 지 알 수 없어요현재 표현에 사용됨.
이 문장은 잊어버리셔도 될 것 같아요.
답변2
echo "\abc\$\\"
(예를 들어)에는 두 단계가 포함됩니다.
첫째, 문자열 매개변수가 echo
큰따옴표로 묶여 있기 때문에 쉘은 그 안의 이스케이프 문자를 처리합니다.
이 경우 에 전달하기 전에 "\abc\$\\"
로 변환됩니다 . "특수" 문자가 아니기 때문에 유언장은 변경되지 않습니다. 다른 이스케이프 문자는 다음과 같습니다.\abc$\
echo
\a
a
단어, 이는 더 이상 셸에서 특별한 의미가 없음을 의미합니다( $
확장은 시작되지 않으며 백슬래시는 다음 문자를 이스케이프하지 않습니다 등). $
큰따옴표로 묶인 문자열 끝에 있는 an은 여전히 "특별"입니다. 그것 때문에할 수 있다확장이 도입되었지만 문자열이 바로 뒤에 끝나지 않습니다. 첫 번째 문자열의 문자열은 어떤 용도로도 사용되어서는 안 되기 때문에 두 문자열 "a$"
및 는 "a\$"
동일합니다 .$
그런 다음 echo
해당 문자열 매개변수를 직접 해석할 수 있습니다. 예를 들어, 의 일부 구현은 echo
"벨 문자"를 나타내는 것으로 간주됩니다.\a
나는 또한 당신이 여기의 기준을 잘못 읽고 있다고 생각합니다. 백슬래시 뒤에 특수 문자 중 하나가 오는 것이 평가됩니다.제거하다백슬래시. 당신은 그것이 동일하게 유지되어야 하고 \$
그대로 유지되어야 한다고 생각하는 것 같습니다 \$
. 이 표준은 다음과 같이 규정합니다.반대의.