환경 변수 앞의 \ 의미

환경 변수 앞의 \ 의미

이전 Solaris 상자의 ksh에서는 다음을 사용했습니다.

export PS1="$PWD $"

프롬프트를 현재 디렉토리로 설정합니다. 다른 곳에서 CD를 사용할 때까지는 훌륭하게 작동하지만 매번 PWD를 평가하지 않는다는 것을 알 수 있습니다. PS1을 다음과 같이 설정하면 문제가 해결되었습니다.

export PS1="\$PWD $"

이름이 무엇인지, 어떻게 작동하는지, 다른 응용 프로그램 등이 궁금합니다. (인터넷 검색에 상당히 저항하는 것 중 하나입니다.)

답변1

몇 가지 문서가 이를 설명하는 데 도움이 될 것입니다.

로부터쉘에 대한 POSIX 표준 문서:

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

따라서 값은 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의 네트워크 어댑터 지정 수가 많아 각각에 대해 명시적으로 코드하는 것이 비현실적인 네트워크 인터페이스를 제어하는 ​​스크립트에서 사용됩니다) ).

관련 정보