
이전 Solaris 상자의 ksh에서는 다음을 사용했습니다.
export PS1="$PWD $"
프롬프트를 현재 디렉토리로 설정합니다. 다른 곳에서 CD를 사용할 때까지는 훌륭하게 작동하지만 매번 PWD를 평가하지 않는다는 것을 알 수 있습니다. PS1을 다음과 같이 설정하면 문제가 해결되었습니다.
export PS1="\$PWD $"
이름이 무엇인지, 어떻게 작동하는지, 다른 응용 프로그램 등이 궁금합니다. (인터넷 검색에 상당히 저항하는 것 중 하나입니다.)
답변1
몇 가지 문서가 이를 설명하는 데 도움이 될 것입니다.
다음 변수는 쉘 실행에 영향을 미칩니다.
PS1: 대화형 쉘이 명령을 읽을 준비가 될 때마다 이 변수의 값은 매개변수 확장을 거쳐 표준 오류에 기록됩니다.
...
작은따옴표
작은따옴표로 묶은 문자는 작은따옴표 내의 각 문자의 리터럴 값을 유지해야 합니다.
...
큰따옴표
큰따옴표로 묶은 문자는 $를 제외하고 큰따옴표 안의 모든 문자의 리터럴 값을 유지해야 합니다.
달러 기호는 매개변수 확장을 도입하는 특별한 의미를 유지해야 합니다
...
이스케이프 문자(백슬래시) )
인용되지 않은 백슬래시는 다음 문자의 리터럴 값을 유지해야 합니다.
따라서 값은 PS1
매개변수 확장에 따라 달라지며 이것이 여러분이 원하는 것이므로 $PWD
프롬프트가 나타날 때마다 평가됩니다. 이는 $PWD
값에 실제 문자열이 있어야 함을 의미합니다 PS1
. 하지만,
PS1="$PWD $ "
가치를 부여할 것이다.PWD
할당문이 실행될 때안으로 PS1
. PS1
와 같을 것이고 /home/poldie $
그 이후에는 절대 변하지 않을 것입니다. 당신은 그것을 원하지 않습니다.
PS1="\$PWD $ "
백슬래시는 을 인용 $
하여 PS1
리터럴 문자열을 포함합니다 $PWD $
. 당신은 이것을 원합니다.
PS1='$PWD $ '
같은 일을 할 것입니다. 작은따옴표로 묶인 경우 매개변수가 확장되지 않습니다.
export
(참고: OP가 명령문으로 작성하기로 선택했기 때문에 원래 이 모든 것을 명령문으로 가지고 있었습니다 export
. @Kusalananda가 이를 제거했습니다. 이유는 잘 모르겠습니다. 하위 쉘(예: :sh
vi의 명령)을 사용하여 사용자 정의 프롬프트를 유지합니다.)
답변2
문자 \
는 다음 (특수) 문자를 이스케이프합니다. 이 경우 $
일반적으로 변수를 역참조하는 데 사용하는 를 이스케이프합니다. 쉘이 변수 할당을 평가할 때 먼저 표현식의 오른쪽을 확장합니다. \
before 가 없으면 $PWD
쉘은 확장 $PWD
되어 결과를 에 할당합니다 PS1
.
그러나 를 사용하면 \
셸은 $PWD
리터럴 문자열로 처리하고 이를 그대로 에 할당하므로 PS1
에는 변수의 확장된 값이 아닌 PS1
문자열이 포함됩니다 . 쉘이 프롬프트를 표시하려고 할 때 다시 한 번 변수 확장을 수행하는데, 이번에는 포함하기 때문에 ,$PWD
$PWD
$PS1
$PWD
없이\
, 쉘은 이를 현재 디렉토리로 성공적으로 확장합니다.
동일한 접근 방식을 사용하여 쉘 스크립트에서 동적 변수 이름을 생성할 수 있습니다(NetBSD rcNG
시스템은 이 방법을 매우 광범위하게 사용합니다. 특히 NetBSD 및 FreeBSD의 네트워크 어댑터 지정 수가 많아 각각에 대해 명시적으로 코드하는 것이 비현실적인 네트워크 인터페이스를 제어하는 스크립트에서 사용됩니다) ).