시작시 bash가 실행중인 스크립트 찾기


15

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먼저 결정하여 확인 하십시오 .


Bash 는 존재하지 않는~/.profile 경우~/.bash_profile 에만 읽습니다 ...
jasonwryan

@jasonwryan, 나는 소스 ~/.profile~/.bashrc에서~/.bash_profile
smac89

답변:


30

시스템 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자세한 정보를 위해 사용 하십시오.


귀하의 의견에 감사하지만 내 배쉬에 심각한 문제가 있다고 생각합니다. echo $0터미널에서 실행 -bash하면 예상보다 제공 됩니다 bash. 이것에 대한 다른 제안이 있습니까?
smac89

3
@ smac89 : 그것은 로그인 쉘에 정상입니다. Bash는의 첫 번째 문자 $0가 대시 -이거나 옵션으로 호출 될 때 로그인 쉘로 작동 합니다 -l.
AlexP

좋습니다. 약간의 도움이됩니다. 내가 준 명령을 실행했는데 출력이 실제로 복잡해 보이지만 표시된 모든 파일에 중복 된 항목이 포함되어 있지 않습니다. 이것은 처음 계정에 로그인 할 때 중복 된 항목이 발생한다고 생각하게합니다. 즉, 처음에 해당 파일의 항목을 소싱하고 터미널을 열 때 다시 수행됩니까? 실제로 나는 그것이 그럴지도 모른다고 생각합니다. 내 계정에 로그인하면 항목이 소싱되고 다시 터미널을 열면 프로세스가 반복됩니다. 그 소리가 가능합니까?
smac89

왜 넣어, 구식 방법을 디버깅하지 않는 echo PATH=\""$PATH"\"시작과 끝 부분에 .profile.bashrc? 그리고 모두가하는 일을하고 PATH를 완전히 설정하거나 디렉토리를 추가하는 경우 보호해야하는 이유는 무엇 echo ":$PATH:" | grep -q ":/path/to/dir:" || export PATH="$PATH:/path/to/dir"입니까?
AlexP

4
sudo bash -c "echo exit|dtruss bash -li|& less|grep '^open'"macOS에서 사용하십시오 . (바로 교체 stracedtruss)
최대 코플란에게
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.