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의 로깅 기능이 아닌 것 같습니다. 댓글이 거의 없습니다.

관련 정보