echo "\*"가 echo "\\*"와 같은 이유

echo "\*"가 echo "\\*"와 같은 이유

제목. ,와 echo "\*"정확히 동일한 출력을 갖습니다 echo "\\*". \*저는 GNU bash 5.2.15를 사용하고 있습니다.

echo "\\*"출력을 기대하고 있지만 왜 출력도 나오는지 \*모르겠습니다 . echo "\*"내가 아는 한 상황은 다음과 같아야 합니다.

  1. 배쉬는 다음을 보았다:$echo "\*"
  2. Bash는 백슬래시를 이스케이프 처리하지 않고 큰따옴표를 처리합니다.$echo \*
  3. Bash는 *백슬래시 이스케이프를 사용합니다.$echo *
  4. 인쇄 를 누르십시오 *.

내 의심은 3에 있다. 백슬래시 *는 2에서 이미 이스케이프 처리되었기 때문에 이스케이프 처리되지 않았다고 생각합니다 . 이 올바른지?

답변1

\\탈출구가 없는 것 같습니다 .

~에서Bash 매뉴얼의 큰따옴표 섹션:

특별한 의미가 없는 선행 백슬래시 문자는 변경되지 않습니다.

따라서 변환되지 않은 곳은 이스케이프되지 않은 곳 "\*"과 동일합니다 . 이 명령은 와 동일한 결과를 생성하므로 아무것도 변환하지 않습니다 ."\\*"\\\echoprintf %s

답변2

예, 실제로 큰따옴표는 와일드카드를 이스케이프 처리합니다 *.

큰따옴표 안의 내용은 아무 의미가 없으므로 *백슬래시로 이스케이프할 수 없습니다.

백슬래시를 처리할 때 bash는 다음 문자가 현재 상태에서 특별한 의미를 갖는지 확인합니다. 그렇다면 백슬래시는 인쇄되지 않고 다음 문자는 이스케이프됩니다. 그렇지 않으면 백슬래시만 인쇄됩니다.

"\*"따라서 첫 번째 백슬래시가 a를 보호 하는 경우 *큰따옴표 컨텍스트에서 이스케이프 처리할 필요가 없으므로 그냥 인쇄합니다.

그러나 혹시라도 "\\*"첫 번째 백슬래시가 백슬래시를 보호합니다.할 수 있는큰따옴표 문맥에서는 특별한 의미를 가지므로 첫 번째 백슬래시로 이스케이프됩니다. 이는 두 번째 백슬래시가 인쇄된다는 의미입니다.

관련 정보