비대화형 셸을 시작할 때 무언가가 항상 실행되고 있는지 어떻게 확인할 수 있나요?

비대화형 셸을 시작할 때 무언가가 항상 실행되고 있는지 어떻게 확인할 수 있나요?

스크립트가 있다고 가정해 보겠습니다.

#!/bin/bash
whoami

foo이 스크립트를 실행할 때 항상 실행 전에 인쇄 되도록 하고 싶습니다 . 사실, 나는 foo스크립트가 실행되기 전에 인쇄되기를 원합니다(이 예제뿐만 아니라).

이 파일을 사용해 보았지만 bashrc작동하지 않는 것 같습니다.

case $- in
    *i*) echo "foo";;
      *) return;;
esac

답변1

~/.bashrcbashposix 모드에서 실행되지 않는 비로그인 대화형 호출에 의해서만 해석됩니다.

bash를 호출할 때마다 해석되는 파일의 경우(posix 모드에서 실행되는 파일 제외) 다음을 사용할 수 있습니다 $BASH_ENV.

$ cat ~/.bashenv
if [[ $- != *i* ]]; then
  echo foo
fi
$ export BASH_ENV=~/.bashenv
$ bash -c 'echo bar'
foo
bar

이것이 echo foo단지 bash의 해석을 위한 것이라면스크립트, 즉 bash호출 될 때 bash /path/to/file( #! /bin/bashshebang을 사용하거나더 정확한 #! /bin/bash -형태) 다른 형태의 비대화형 셸 호출(예: ( bash -c code코드 실행 시, , GNU...에 의해 수행됨) 또는 ) 대신 로 변경할 수 있습니다.xtermviparallel$SHELLbash < file[[ $- != *i* ]][[ $- != *[ics]* ]]

zsh에 해당하는 것은 ~/.zshenv(또는 $ZDOTDIR/.zshenv)입니다.

통과하지 않는 한 모든 csh/tcsh는 read()를 호출합니다 ~/.cshrc(이것이 대부분의 csh 스크립트에 shebang이 있는 이유입니다).~/.tcshrc-f#! /bin/csh -f

ksh는 를 준수했지만 $ENV보안상의 이유로 비대화형 쉘에서는 중단되었습니다( $ENV대화형 호출 처리는 여전히 POSIX 요구 사항이며 sh쉘 사용자 정의 파일을 가질 수 있는 유일한 방법입니다).


¹ as로 호출될 때 sh, 환경이 있을 때 $POSIXLY_CORRECT또는 SHELLOPTS=posixwih로 호출될 때 와 같습니다 -o posix. ~/.bashrc일부 bash 버전을 사용하여 ssh를 통해 비대화형 호출을 수행할 때 bash 쉘에서 해석될 수도 있습니다. Bash 시작 파일 처리는 약간 혼란스럽습니다.

관련 정보