환경 변수 앞의 \의 의미

환경 변수 앞의 \의 의미

이전 Solaris 시스템의 ksh에서는 다음을 사용했습니다.

export PS1="$PWD $"

프롬프트를 현재 디렉터리로 설정합니다. 다른 곳에서 CD를 사용하기 전까지는 잘 작동하지만 매번 PWD를 평가하지 않는다는 사실을 알게 됩니다. PS1을 다음과 같이 설정하면 문제가 해결된 것으로 나타났습니다.

export PS1="\$PWD $"

이름이 무엇인지, 어떻게 작동하는지, 다른 응용 프로그램 등이 궁금합니다. (이것은 Google이 어려운 것 중 하나입니다.)

답변1

일부 문서는 이를 설명하는 데 도움이 될 것입니다.

~에서쉘용 POSIX 표준 문서:

다음 변수는 쉘 실행에 영향을 줍니다.
PS1: 대화형 쉘이 명령을 읽을 준비가 될 때마다 이 변수의 값은 매개변수 확장되어 표준 오류에 기록됩니다.
...
작은따옴표
작은따옴표로 묶은 문자는 작은따옴표 안의 각 문자의 리터럴 값을 유지해야 합니다.
...
큰따옴표
큰따옴표로 묶인 문자는 $를 제외하고 큰따옴표 안의 모든 문자의 리터럴 값을 유지해야 합니다.
달러 기호는 매개변수 확장을 도입하기 위한 특별한 의미를 유지해야 합니다
...
이스케이프 문자(백슬래시)
는 추가되지 않습니다 . 인용된 백슬래시는 다음 문자의 리터럴 값을 유지해야 합니다.

So 값은 PS1원하는 매개변수 확장에 따라 달라지므로 $PWD프롬프트가 나타날 때마다 평가됩니다. 이는 $PWD값에 실제 문자열이 있어야 함을 의미합니다 PS1. 하지만,

PS1="$PWD $ "

가치를 두겠습니다PWD 할당문을 실행할 때입력하다 PS1. PS1앞으로도 그럴 것이고 /home/poldie $결코 변하지 않을 것이다. 당신은 이것을 원하지 않습니다.

PS1="\$PWD $ "

백슬래시는 리터럴 문자열을 포함하기 $위해 인용됩니다 . 당신은 이것을 원합니다.PS1$PWD $

PS1='$PWD $ '

같은 일을 할 것입니다. 매개변수를 작은따옴표로 묶으면 확장되지 않습니다.

export(참고: OP가 명령문으로 작성하기로 선택했기 때문에 원래 이 모든 것을 명령문으로 작성했습니다 export. @Kusalananda가 이를 제거했습니다. 이유는 잘 모르겠습니다. 서브셸을 원하는 경우(예: :shvi의 명령으로) 자신의 것을 보존하려면 프롬프트를 정의합니다.)

답변2

\문자는 다음 (특수) 문자를 이스케이프합니다. 이 경우 $변수를 역참조하기 위해 일반적으로 사용하는 것을 이스케이프합니다. 쉘이 변수 할당을 평가할 때 먼저 표현식의 오른쪽을 확장합니다. \before가 없으면 $PWD쉘이 확장되어 $PWD결과를 에 할당합니다 PS1.

그러나 \쉘은 이를 $PWD리터럴 문자열로 처리하고 있는 그대로 할당하므로 PS1변수 의 확장된 값이 아닌 PS1문자열이 포함됩니다 . 쉘이 프롬프트를 표시하려고 할 때 변수 확장을 다시 수행하며 이번에 는 ,$PWD$PWD$PS1$PWD아니요\, 쉘은 이를 현재 디렉토리로 성공적으로 확장합니다.

동일한 방법을 사용하여 쉘 스크립트에서 동적 변수 이름을 만들 수 있습니다(NetBSD rcNG시스템은 이 방법을 매우 광범위하게 사용합니다. 특히 네트워크 인터페이스를 제어하는 ​​스크립트에서 NetBSD 및 FreeBSD에서 네트워크 어댑터 수를 지정하면 각 어댑터에 대해 명시적으로 지정됩니다. 실용적이지 않음).

관련 정보