제목. ,와 echo "\*"
정확히 동일한 출력을 갖습니다 echo "\\*"
. \*
저는 GNU bash 5.2.15를 사용하고 있습니다.
echo "\\*"
출력을 기대하고 있지만 왜 출력도 나오는지 \*
모르겠습니다 . echo "\*"
내가 아는 한 상황은 다음과 같아야 합니다.
- 배쉬는 다음을 보았다:
$echo "\*"
- Bash는 백슬래시를 이스케이프 처리하지 않고 큰따옴표를 처리합니다.
$echo \*
- Bash는
*
백슬래시 이스케이프를 사용합니다.$echo *
- 인쇄 를 누르십시오
*
.
내 의심은 3에 있다. 백슬래시 *
는 2에서 이미 이스케이프 처리되었기 때문에 이스케이프 처리되지 않았다고 생각합니다 . 이 올바른지?
답변1
\
\
탈출구가 없는 것 같습니다 .
특별한 의미가 없는 선행 백슬래시 문자는 변경되지 않습니다.
따라서 변환되지 않은 곳은 이스케이프되지 않은 곳 "\*"
과 동일합니다 . 이 명령은 와 동일한 결과를 생성하므로 아무것도 변환하지 않습니다 ."\\*"
\\
\
echo
printf %s
답변2
예, 실제로 큰따옴표는 와일드카드를 이스케이프 처리합니다 *
.
큰따옴표 안의 내용은 아무 의미가 없으므로 *
백슬래시로 이스케이프할 수 없습니다.
백슬래시를 처리할 때 bash는 다음 문자가 현재 상태에서 특별한 의미를 갖는지 확인합니다. 그렇다면 백슬래시는 인쇄되지 않고 다음 문자는 이스케이프됩니다. 그렇지 않으면 백슬래시만 인쇄됩니다.
"\*"
따라서 첫 번째 백슬래시가 a를 보호 하는 경우 *
큰따옴표 컨텍스트에서 이스케이프 처리할 필요가 없으므로 그냥 인쇄합니다.
그러나 혹시라도 "\\*"
첫 번째 백슬래시가 백슬래시를 보호합니다.할 수 있는큰따옴표 문맥에서는 특별한 의미를 가지므로 첫 번째 백슬래시로 이스케이프됩니다. 이는 두 번째 백슬래시가 인쇄된다는 의미입니다.