스크립트를 여러 번 가져오는 것을 피하세요

스크립트를 여러 번 가져오는 것을 피하세요

현재 Mac에서 터미널을 열면 자동으로 다음을 호출합니다.

source ~/.bash_profile.

~/.bashrc그러나 나를 혼란스럽게 하는 것은 내 쉘이 또는 ~/.profile. 하지만 그건 아마도 전형적인 일이겠죠.

source에서 사용하거나 상속받은 스크립트가 많이 있습니다 .. 이러한 호출을 에 넣으면 ~/.bash_profile새 셸 창을 로드하는 데 시간이 걸릴 수 있으며 때로는 3~4초 정도 걸릴 수 있으며 이는 오래될 수 있습니다. 저는 이러한 스크립트를 한 번만 가져오고 내 파일이 어떻게든 이를 상속받도록 하는 방법이 있다고 생각합니다 ~/.bash_profile.

내 ~/.bash_profile에서 source ~/.bashrc 또는 source ~/.profile을 호출하는 것은 내가 원하는 것이 아니며 아마도 나쁜 생각일 것입니다. 이것은 각각의 새 쉘이 느리게 로드되는 문제를 해결하지 못하기 때문에 내가 하고 싶은 것이 아닙니다.

새로운 bash 터미널 창을 열 때마다 다음과 같은 내용이 기록됩니다.

starting to load /etc/profile
finished loading /etc/profile
starting to load bash_profile
finished loading bash_profile

이는 말이 되지만 실망스럽습니다. 새 셸을 열 때마다 실제로 로드해야 합니까? 매번 모든 것을 다시 로드할 필요가 없도록 멋진 상속을 수행할 수 없는 이유는 무엇입니까?

문제를 보여주는 비디오를 만들었습니다. 제가 정기적으로 사용하는 터미널 애플리케이션은 4개입니다.

terminal.app                  # misbehaves
iterm2                        # misbehaves
webstorm terminal emulator    # misbehaves
vscode terminal emulator      # behaves!

VSCode는 실제로 내가 원하는 방식으로 실행됩니다. 내 생각엔 상위 셸에 ~/.bash_profile을 로드하여 이 작업을 수행하고 vscode가 시작될 때 한 번만 실행하는 것 같습니다. 애플리케이션의 모든 터미널 창은 이 상위 셸의 하위 셸입니다.

이 동영상을 통해 문제가 명확해지기를 바랍니다. https://www.uselooom.com/share/4e62f0cb24434c4a83b8bd32844b596a

이것은 타당한 질문입니다. 대부분의 터미널 애플리케이션은 모든 작업을 잘못 수행하지만 아주 기적적으로 Microsoft의 VSCode는 실제로 모든 작업을 올바른 방식으로 수행합니다. 다음 질문을 참조하세요.

https://youtrack.jetbrains.com/issue/WEB-31390

답변1

진부한 표현은 출처보다는 출처를 중심으로 쓰는 것이 더 좋지 않을까 싶습니다. (예: C 헤더 파일)

[[ "${_NAME_OF_THIS_LIBSCRIPT:-""}" == "yes" ]] && return 0
_NAME_OF_THIS_LIBSCRIPT=yes

이렇게 하면 여러 위치에서 공유되는 콘텐츠가 포함되어야 하는 스크립트 파일을 얻을 때마다 동일한 상용구를 반복할 필요가 없습니다. 아니면 내가 뭔가를 놓치고 있는 걸까? 솔직히 말해서 저는 bash 프로그래밍 전문가가 아니기 때문에 다른 사람들의 의견을 듣고 싶습니다.

답변2

오늘 아침에 나는 내 파일에서 많은 개인 정보를 옮겨서 bash_profile이라는 bashrc새 파일에 추가했습니다 privaterc.

privaterc파일에서 다음 변수를 설정했습니다.

PRIVATERC_RUN=yes 

이제 내 항목에 bash_profile다음 줄을 추가했습니다.

[[ $PRIVATERC_RUN != yes && -f ~/.privaterc ]] && source ~/.privaterc

privaterc이렇게 하면 해당 셸에서 이전에 리소스를 가져오지 않은 경우에만 리소스를 가져오게 됩니다 .


또한, 당신이 보고 있는 이상한 프로필에 대해 내가 댓글에 링크한 기사에는 Mac에 대해 다음과 같이 명시되어 있습니다.

Mac OS X—예외

터미널 창 지침에 대한 한 가지 예외는 Mac OS X의 Terminal.app입니다. 이 앱은 기본적으로 각각의 새 터미널 창에 대해 로그인 셸을 실행하여 .bashrc 대신 .bash_profile을 호출합니다. 다른 GUI 터미널 에뮬레이터도 동일한 작업을 수행할 수 있지만 대부분은 그렇지 않습니다.

답변3

rc 파일에 고유 변수(1바이트 이상)를 배치하고 bash_profile을 가져오기 전에 길이가 0보다 큰지 확인하십시오.

if [ ! X”” = X”$uniq_var” ] ; then . ~/.bash_profile ; fi

방금 MacOS에서 로그인 셸로 bash를 설정했는데 이 문제가 발생하지 않습니다. 어쩌면 그들은 또 뭔가를 바꿨을지도 모릅니다.

답변4

이것은 Hiroshi_U의 답변을 기반으로 한 테스트 버전입니다.

나중에 뭔가를 변경하고 업데이트된 결과를 얻으려고 하면 함수가 최신 상태가 되지 않도록 mylib.sh기능을 테스트하고 싶습니다 . 새로 만들려면 $ source mylib.sh;sysLog Hey설정을 해제해야 합니다 . and 와 같은 것을 생성하기 _NAME_OF_THIS_LIBSCRIPT때문에 스크립트 파일에서 실행되는지 아니면 쉘에서 실행되는지 테스트했습니다 .$ echo $0-sh-bash-

mylib.sh

#!/bin/sh

MY_BASE=$0
[[ "${_NAME_OF_THIS_LIBSCRIPT:-""}" == "yes" ]] && return 0
[[ "${MY_BASE:0:1}" != "-" ]] && _NAME_OF_THIS_LIBSCRIPT=yes

function sysLOG() {
    echo $1 $_NAME_OF_THIS_LIBSCRIPT
}

테스트 파일

#!/bin/sh

source /tmp/mylib.sh
sysLOG 1
source /tmp/mylib.sh
sysLOG 2
source /tmp/mylib.sh
sysLOG 3

$ test.sh;echo $_NAME_OF_THIS_LIBSCRIPT
1 yes
2 yes
3 yes

$ source mylib.sh;sysLog Hey;echo $_NAME_OF_THIS_LIBSCRIPT
Hey! yes

아니요[[ "${MY_BASE:0:1}" != "-" ]] &&

$ source mylib.sh;sysLog Hey;echo $_NAME_OF_THIS_LIBSCRIPT
Hey! yes
yes

관련 정보