내 쉘은 어떤 시작 파일을 사용하고 있나요?

내 쉘은 어떤 시작 파일을 사용하고 있나요?

Google Compute Engine에 우분투를 설치하면 여러 시작 파일이 있습니다.

현재 사용 중인 셸에서 어떤 시작 파일을 사용하고 있는지 알려주는 명령이 있나요?

답변1

쉘이 일반적으로 시작 시 읽는 파일 목록은 몇 개로 제한됩니다. 그러나 그들은 차례로원천다른 것들은 복잡한 완성 시스템을 로드할 때와 같이 매우 큰 숫자가 될 수 있습니다.

한 가지 방법은 다음을 사용하여 셸을 실행하는 것입니다.

strace -e open your-shell

truss(또는 // tusc... 와 같은 시스템의 해당 명령 dtruss)

그러면 쉘에서 열린 모든 파일이 나열됩니다. 또한 열었던 파일과 시작되지 않은 파일, 시도했지만 열 수 없었던 파일도 나열됩니다.

xtrace또 다른 접근 방식은 쉘이 각 명령에 대해 수행할 작업을 stderr에 인쇄하는 일부 쉘 모드를 사용하는 것입니다 . 이렇게 하려면 -x이 옵션을 사용하여 셸을 호출하기만 하면 됩니다.

기본적으로 일부 셸은 zsh실행 중인 코드가 있는 파일의 경로를 인쇄합니다( 예를 들어 함수 내에서 실행되는 코드의 파일 이름을 인쇄하는 등 PS4으로 설정할 수도 있음). 또는 +%x>같은 다른 경우에는 변수를 수정하여 인쇄하도록 할 수 있습니다 .bashksh93$PS4

PS4='+$BASH_SOURCE> ' bash -x
PS4='+${sh.file}> ' ksh93 -x
PS4='+%x> ' zsh -x

를 사용하면 bash파일의 고유 경로만 보존되도록 출력을 사후 처리할 수 있습니다. 예를 들면 다음과 같습니다.

PS4=' <:>$BASH_SOURCE<:>' BASH_XTRACEFD=3 3> >(
  awk -F'<:>' 'NF>2 && !seen[$2]++ {print $2}') bash -x

(시작 파일 경로에 개행 문자가 포함되어 있지 않거나 <:>포함된 시작 파일에서 여러 줄 명령이 실행되지 않는다고 가정 <:>)

이러한 xtrace기반 방법은 비어 있거나 주석 또는 함수 정의만 포함하는 시작 파일을 나열하지 않으며(해당 함수가 나중에 실행되지 않는 한) 쉘이 존재하는 경우 처리할 시작 파일도 나열하지 않습니다.

그러나 함수가 정의된 파일을 검색할 수 있습니다.

eval "(shopt -s extdebug; declare() { typeset -F \"\$2\"; }
  $(typeset -F))" | cut -d ' ' -f 3- | sort -u

그리고 bash또는

type ${(k)functions} | sed -n 's/.*is a shell function from //p' | sort -u

그리고 zsh.

관련 정보