파일을 가져오면 내보낸 환경 변수의 경로가 변경되는 이유는 무엇입니까?

파일을 가져오면 내보낸 환경 변수의 경로가 변경되는 이유는 무엇입니까?

.foo.sh내보내기만 포함된 파일이 있습니다.

export foo="../../../../"
export bar="a/b/c/d/"
export baz="a/b/c/d/e/f"

스크립트에서 파일의 소스는 다음과 같습니다(스크립트의 다른 어떤 것도 이에 영향을 미치지 않는 것을 확인했으며 테스트 스크립트는 이 작업만 수행합니다).

!#/bin/bash
cd u/v/x/y/z/
source .foo.sh

그러나 환경 변수가 올바르게 설정되지 않았습니다. echo "foo $foo bar $bar baz $baz"소싱 전후에 추가 하면 다음과 같은 결과가 나타납니다.

foo  bar  baz 
foo . bar .. baz ../e/f

추가하면 cat .foo.sh스크립트가 다음과 같이 표시됩니다.

!#/bin/bash
cd u/v/x/y/z/
cat .foo.sh
echo "foo $foo bar $bar baz $baz"
source .foo.sh
echo "foo $foo bar $bar baz $baz"

나는 다음과 같은 결과를 얻습니다.

export foo="../../../../"
export bar="a/b/c/d/"
export baz="a/b/c/d/e/f"
foo  bar  baz 
foo . bar .. baz ../e/f

소스 줄을 다음과 같은 내용으로 바꾸면 .foo.sh:

!#/bin/bash
cd u/v/x/y/z/
echo "foo $foo bar $bar baz $baz"
export foo="../../../../"
export bar="a/b/c/d/"
export baz="a/b/c/d/e/f"
echo "foo $foo bar $bar baz $baz"

나는 다음과 같은 결과를 얻습니다.

foo  bar  baz 
foo ../../../../ bar a/b/c/d/ baz a/b/c/d/e/f

소스 파일이 CWD에 있고 내보낸 경로가 하드코딩된 문자열인데도 인라인으로만 내보낼 때와 비교하여 소스 파일로 내보낼 때 경로가 다른 디렉터리에 상대적으로 변경되는 이유는 무엇입니까?

답변1

.foo.shmy에 나열된 디렉토리에 PATH동일한 변수를 내보내지만 다른 값을 갖는 파일이 있습니다. 일반적인 명령을 실행하는 것처럼 파일을 가져올 때 쉘은 먼저 PATH. which .foo.sh실행 파일처럼 아무것도 반환되지 않는다는 점을 고려하면 더욱 혼란스럽습니다. 그러나 스크립트를 이와 같은 소스로 변경하면 source ./.foo.sh문제가 해결되었습니다.

관련 정보