OLDPWD는 내보내지고 모든 하위 스크립트로 전달되지만 bash는 하위 스크립트가 시작될 때 분명히 OLDPWD를 지웁니다.
$ cd /etc
$ cd
$ perl -e 'print "<$ENV{OLDPWD}>\n"'
</etc>
$ ksh -c 'echo "<$OLDPWD>"'
</etc>
$ bash -c 'echo "<$OLDPWD>"'
<>
$OLDPWD를 첨자에 사용하려고 할 때마다 별칭이나 pip 첨자를 생성하거나 동일한 값을 가진 다른 변수를 내보내는 것 외에 다른 방법이 있습니까?
** 2015년 11월 26일 업데이트됨 **
나는 bash 버그 보고서를 제출했고 bash 관리자인 Chet Ramey로부터 다음과 같은 응답을 받았습니다.
아래 첨자가 시작될 때 bash가 OLDPWD를 지우는 이유는 무엇입니까?
새 쉘에는 "이전 작업 디렉토리"가 없기 때문입니다. CD를 통해 설정해야 합니다. CD를 실행하지 않았다면 CD가 없는 것입니다.
쉘이 현재 디렉토리의 이름을 지정할 때 PWD를 상속하는 것처럼 디렉토리의 이름을 지정하면 OLDPWD를 상속하는 것이 합리적이므로 다음 bash 버전에서는 이를 시도할 것입니다.
답변1
이것은 아마도 오래 전에 bash가 처음 구현되었을 때 남은 동작일 것입니다 OLDPWD
. bash 2.03 alpha(1999)의 릴리스 노트에는 OLDPWD
이전에 내보낸 변수가 아니었음을 나타냅니다. 내보내지 않으면 하위 프로세스가 이를 상속하지 않습니다.
Bash 소스 코드에서 이 블록에 대한 주석을 보면 이 동작은 의도적인 것입니다.
/* According to the Single Unix Specification, v2, $OLDPWD is an
`environment variable' and therefore should be auto-exported.
Make a dummy invisible variable for OLDPWD, and mark it as exported. */
temp_var = bind_variable ("OLDPWD", (char *)NULL, 0);
VSETATTR (temp_var, (att_exported | att_invisible));
릴리스 노트에는 POSIX.2를 준수하기 위해 내보내는 것으로 나와 있지만 OLDPWD
목록에는 나타나지 않습니다.쉘 변수POSIX 쉘의 경우. 설명에 나와있어요cd
. 이는 초기 값을 상위 프로세스에서 가져와야 하는지 여부를 언급하지 않으며 특정 동작이 필요하지 않습니다.
Bash의 로깅 기능이 아닌 것 같습니다. 댓글이 거의 없습니다.
- MacOSX의 Erlang에서 OLDPWD가 누락되었습니다.
- ..."OLDPWD가 설정되지 않았습니다"..., 초기 서브쉘을 나타냄가지다
cd
사전 설정된 명령이 없습니다$OLDPWD
.