시작시 bash가 실행중인 스크립트 찾기 하나의 항목

bash 터미널을 시작한 후 PATH 변수에 중복 항목이 포함되어 있음을 알았습니다. 내 터미널은 시작 로그인 쉘을 그래서, ~/.bash_profile다음, 소스로 ~/.profile~/.bashrc. ~/.profile중복 된 경로 항목 만 작성합니다.

pedantic하기 위해서, 이것은 소스가되어야하는 파일들이 소스가되는 순서입니다 :

Sourced /etc/profile
Sourced /etc/bash.bashrc
Sourced .bash_profile
Sourced .profile
Sourced .bashrc

누구든지 이것을 “PATH 변수에 중복이 포함되어 있음”의 중복으로 표시하기 전에 계속 읽으십시오.

처음에 나는 이것이 ~/.profile두 번 소싱되는 것과 관련이 있다고 생각 했기 때문에 파일이 소싱 될 때마다 파일을 로그 파일에 쓰게되고 놀랍게도 한 번만 소싱되었다는 것을 알려주는 하나의 항목 만 기록했습니다. 더 놀라운 것은에있는 항목을 주석 처리 할 때 ~/.profile항목이 여전히 PATH변수에 나타납니다 . 이로 인해 세 가지 결론이 나왔는데 그 중 하나는 빨리 배제되었습니다.

  1. Bash는 유효한 bash 주석을 무시하고 주석이 달린 코드를 계속 실행합니다.
  2. ~/.profile출력을 출력하는 코드 (예 : 로그 파일)를 읽고 무시 하는 스크립트가 있습니다.
  3. ~/.profile다른 곳에서 공급되는 다른 사본이 있습니다.

첫 번째는 빠른 테스트로 인해 사실이 아니라고 결론을 내 렸습니다. 두 번째 및 세 번째 옵션은 도움이 필요한 곳입니다.

터미널을 시작할 때 실행되는 스크립트 로그를 어떻게 수집합니까? 나는 echobash가 소스인지 확인하기 위해 확인한 파일을 사용 했지만 터미널이 입력을 시작할 준비가되었을 때 실행을 추적하는 결정적인 방법을 찾아야합니다.

위의 방법을 사용할 수 없다면, 어느 스크립트가 실행 중인지 어디에서 볼 수 있는지 제안 할 수 있습니다 .


향후 참조

이것은 내 경로에 추가하는 데 사용하는 스크립트입니다.

function add_to_path() {
    for path in ${2//:/ }; do
        if ! [[ "${!1}" =~ "${path%/}" ]]; then # ignore last /
            new_path="$path:${!1#:}"
            export "$1"="${new_path%:}" # remove trailing :
        fi
    done
}

나는 이것을 다음과 같이 사용한다 :

add_to_path 'PATH' "/some/path/bin"

스크립트는 경로 앞에 변수가 존재하는지 확인합니다.

zsh 사용자의 경우 다음과 같은 기능을 사용할 수 있습니다.

function add_to_path() {
    for p in ${(s.:.)2}; do
        if [[ ! "${(P)1}" =~ "${p%/}" ]]; then
            new_path="$p:${(P)1#:}"
            export "$1"="${new_path%:}"
        fi
    done
}

2018 년 8 월 28 일 수정

이 스크립트로 내가 할 수있는 또 하나의 일은 경로를 수정하는 것입니다. .bashrc파일을 시작할 때 다음과 같이합니다.

_temp_path="$PATH"
PATH='/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin'
add_to_path 'PATH' "$_temp_path"
unset _temp_path

무엇으로 PATH시작 해야하는지는 당신에게 달려 있습니다 . PATH먼저 결정하여 확인 하십시오 .



답변

시스템 strace에 쉘이 연 파일을 나열 할 수 있습니다 (예 :

echo exit | strace bash -li |& grep '^open'

( -li로그인 대화식 로그인을 의미 -i합니다. 대화 형 비 로그인 쉘 에만 사용하십시오 .)

셸에서 열거 나 열려고하는 파일 목록이 표시됩니다. 내 시스템에서 다음과 같습니다.

  1. /etc/profile
  2. /etc/profile.d/*(의 다양한 스크립트 /etc/profile.d/)
  3. /home/<username>/.bash_profile (이것은 실패합니다, 나는 그런 파일이 없습니다)
  4. /home/<username>/.bash_login (이것은 실패합니다, 나는 그런 파일이 없습니다)
  5. /home/<username>/.profile
  6. /home/<username>/.bashrc
  7. /home/<username>/.bash_history (명령 행의 역사; 이것은 스크립트가 아닙니다)
  8. /usr/share/bash-completion/bash_completion
  9. /etc/bash_completion.d/* (자동 완성 기능을 제공하는 다양한 스크립트)
  10. /etc/inputrc (키 바인딩을 정의합니다; 이것은 스크립트가 아닙니다)

man strace자세한 정보를 위해 사용 하십시오.