내 쉘에서 어떤 시작 파일을 사용하고 있습니까?

내 쉘에서 어떤 시작 파일을 사용하고 있습니까?

Google 컴퓨팅 엔진의 우분투 설치에는 여러 시작 파일이 있습니다.

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

답변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.

관련 정보