기능과 관련된 환경 변수가 올바르게 확장되지 않습니다.

기능과 관련된 환경 변수가 올바르게 확장되지 않습니다.

이것은 내 파일의 일부입니다 .bashrc.

echo_pwd () {
    echo `pwd`
}
export echo_pwd="`echo_pwd`/"

echo_pwd현재 디렉터리의 경로와 슬래시가 뒤에 오는 현재 디렉터리를 포함하는 새 환경 변수를 인쇄하는 새 함수를 만들었습니다 . 따라서 명령줄에서 환경 변수(예 $PWD: )를 사용할 수 있습니다.

그러나 이 환경 변수는 올바르게 확장되지 않으며 항상 내 홈 디렉터리를 참조합니다.

~/Documents$ env | grep echo_pwd
echo_pwd=/home/pierre/
~/Documents$

환경 변수를 올바르게 확장하려면 어떻게 해야 합니까?

참고: 이는 분명히 더미 예제입니다. 내 특정 사용 사례에서는 이것이 echo_pwd더 복잡한 기능입니다.

답변1

함수를 실행하고 변수 값을 한 번만 설정할 수 있습니다.

사용 시 변수 값을 자동으로 업데이트하려면 다음과 같이 cd셸의 내장 함수를 재정의할 수 있습니다 .cd

cd () {
    builtin cd "$@"
    echo_pwd=$( echo_pwd )/
}

cd이는 함수에 제공한 모든 인수를 사용하여 내장 함수를 호출 cd한 다음 변수 값을 업데이트합니다( export다른 곳으로 내보냈거나 전혀 내보내야 하는 경우에는 필요하지 않음).

전체 설정은 다음과 같습니다.

echo_pwd () {
    printf '%s\n' "$PWD"    # or just: pwd
}
export echo_pwd="$( echo_pwd )/"

cd () {
    builtin cd "$@"
    echo_pwd=$( echo_pwd )/
}

나는 선택했다사용printf$PWD유틸리티 에 전화하는 대신 pwd나도명령 $(...)대체용.

답변2

에서는 export echo_pwd="`echo_pwd`/"변수 설정 시 명령 대체가 한 번만 수행됩니다.

변수 값을 업데이트해야 하는 경우 다시 설정해야 합니다.

대화형 bash에서는 다음을 사용할 수 있습니다.PROMPT_COMMAND, 프롬프트가 인쇄될 때마다 실행됩니다.

$ PROMPT_COMMAND='echo_pwd="`echo_pwd`/"'
$ cd bar/
$ echo $echo_pwd/
/tmp/foo/bar//
$ cd baz
$ echo $echo_pwd
/tmp/foo/bar/baz/

관련 정보