Linux 경로 환경 /etc/profile.d/*.sh를 구성하고 두 번 실행하는 것이 혼란스럽습니까?

Linux 경로 환경 /etc/profile.d/*.sh를 구성하고 두 번 실행하는 것이 혼란스럽습니까?

PKG_CONFIG_PATH를 CentOS로 설정하려고 합니다. 아래는 제가 시도하는 코드입니다.

export |grep PKG_CONFIG_PATH

출력이 안되고 정상...

echo "$PKG_CONFIG_PATH"
:/usr/local/lib/pkgconfig

여기에 출력이 있는 이유는 무엇입니까? ?

만약 내가

sudo sh -c "echo 'export PKG_CONFIG_PATH=$PKG_CONFIG_PATH :/usr/local/lib/pkgconfig' >> /etc/profile.d/path.sh
source /etc/profile.d/path.sh

이제 같은 경로가 두 번 나타납니다...

export |grep PKG_CONFIG_PATH
declare -x PKG_CONFIG_PATH=:/usr/local/lib/pkgconfig:/usr/local/lib/pkgconfig

그렇다면 경로가 아직 설정되지 않은 경우 $PKG_CONFIG_PATH는 어디서 오는 걸까요?

업데이트된 편집: 재부팅 후 변수가 지워지기 때문에 질문의 첫 번째 부분은 실제로 중요하지 않습니다.

진짜 문제는 profile.d에 있는 파일이 /etc/bashrc에 의해 두 번 호출되고 /etc/profile에 의해 한 번 호출되기 때문이라고 생각합니다. WTH에게 물어볼 수도 있나요? 왜 이런 일이 발생합니까? 벌레? 오식?

답변1

그게 차이점이에요출구그리고비수출환경 변수.

export명령은 목록만 나열합니다.내보낸 환경 변수export즉, 쉘이 상위 프로세스에서 상속했거나 또는 명령 declare -x을 사용하여 내보내기 가능으로 표시했기 때문에 하위 프로세스에서 상속 가능으로 표시된 변수입니다 .

내보내지 않은 변수는 스크립트 내에서 사용할 수 있지만 하위 프로세스의 환경을 방해하지 않으므로 스크립트에 유용합니다.

내보내지 않은 변수를 설정하려면 name=value다음 구문만 사용하면 됩니다.

$ FOO=bar
$ echo $FOO
bar
export | grep FOO
$

나중에 변수를 내보내기 가능으로 표시할 수 있습니다.

...
$ export FOO
$ export | grep FOO
declare -x FOO="bar"

실제로 고전적인 Bourne 쉘필수의2단계 프로세스로 환경 변수를 초기화할 수 있습니다. 먼저 값을 설정한 다음 내보내기 가능으로 표시합니다. 따라서 최대 이식성을 위해 설계된 셸 스크립트에서는 이 구문을 계속 볼 수 있습니다.

FOO=bar
export FOO

최신 셸을 사용하면 이 작업을 한 단계로 수행할 수 있습니다.

$ export FOO=bar

따라서 귀하의 경우에는 PKG_CONFIG_PATH=:/usr/local/lib/pkgconfig이전에 수동으로 수행했거나원천스크립트 또는 로그인 스크립트의 일부로.

답변2

이제 두 가지 해결책이 있습니다.

  1. /etc/bashrc에서 이 코드를 제거하세요.

    for i in /etc/profile.d/*.sh; do
      if [ -r "$i" ]; then
         if [ "$PS1" ]; then
            . "$i"
         else
           . "$i" >/dev/null
         fi
      fi
    done
    

    문제는 애초에 이 코드가 왜 거기에 있어야 하는지 알 수 없고, 코드를 제거하면 부작용이 발생할 수 있다는 것입니다.

  2. /etc/profile.d/*.sh에서 직접 할당을 사용하세요.

    export PKG_CONFIG_PATH=:/usr/local/lib/pkgconfig
    

    물론 이는 기존 경로를 제외하며 표준 관행이 아닙니다.

그들 중 누구도 완벽한 해결책이 아닌 것 같습니다. 더 나은 제안이 있습니까?

고쳐 쓰다:

①을 실행하면 터미널에 입력된 각 명령 후에 이 오류 메시지가 나타납니다.

 bash: __vte_prompt_command: command not found

관련 정보