bashrc의 비대화형 버전이 없는 이유는 무엇입니까?

bashrc의 비대화형 버전이 없는 이유는 무엇입니까?

내가 이해한 바에 따르면 데몬은 백그라운드 프로세스이지만 환경 변수를 설정하려면 데몬에 고유한 구성 파일이 필요합니다.

예를 들어 Hadoop 데몬에는 다음이 필요합니다.hadoop-env.sh환경 변수를 설정하려면 JAVA_HOME단순히 에서 시작할 수는 없습니다 ~/.bashrc.

그 이유는 데몬이 백그라운드 프로세스라는 것은 비대화형임을 의미하고 ~/.bashrc는 방지하기 위해 대화형 세션에서만 사용되어야 하기 때문입니다.alias cp='cp -i'사례.

최신 ~/.bashrc파일의 상단에는 비대화형 호출자를 허용하지 않는 안전 가드가 있습니다. 즉, -i어떤 옵션도 일찍 반환되지 않습니다.

# ~/.bashrc: executed by bash(1) for non-login shells.
# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)
# for examples
# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac

이로 인해 bashrc가 구성 파일을 3개의 그룹으로 분리하지 않는 이유가 궁금합니다. 예를 들면 다음과 같습니다.

  • ~/.bashrc_interactive

  • ~/.bashrc_non_interactive

  • ~/.bashrc_global #(대화형 및 비대화형)

따라서 사용자는 모든 데몬 파일에 이 환경 변수를 반복해서 추가하는 대신에 이를 설정 JAVA_HOME하거나 추가할 수 있습니다.~/.bashrc_non_interactive~/.bashrc_global

bashrc가 이를 지원하지 않거나 다른 방식으로 비대화식으로 지원하지 않는 이유나 제한이 있습니까? 아니면 제가 일부 개념을 잘못 이해한 걸까요?

답변1

BASH_ENV비대화형 쉘 스크립트를 실행하기 전에 구문 분석하는 파일의 경로 이름을 설정할 수 있는 기회가 이미 있습니다 .

예를 들어, crontab에서 다음을 수행할 수 있습니다.

@hourly BASH_ENV="$HOME/.bashrc_non_interactive" "$HOME/bin/mybashscript"

심지어

BASH_ENV="$HOME/.bashrc_non_interactive"

@hourly "$HOME/bin/mybashscript"
@daily  "$HOME/bin/myotherbashscript"

$BASH_ENV/etc일반적으로 비어 있지만 서버에서 전체적으로 설정하여 아래의 파일을 가리키는 것을 막을 수는 없습니다.

if [ -f "$HOME/.bashrc_non_interactive" ]; then
    . "$HOME/.bashrc_non_interactive"
fi

그러나 스크립트가 등과 같은 특정 변수를 설정해야 하는 경우 스크립트별로 명시적으로 설정하거나 스크립트 자체에서 관련 파일을 명시적으로 가져오거나 그냥 설정하는 것이 JAVA_HOME좋습니다. BASH_ENV스크립트의 변수입니다. 모으다모두비대화형 셸이 단일 파일에서 사용하려는 모든 항목은 스크립트 속도를 저하시킬 수 있으며 원치 않는 콘텐츠로 스크립팅 환경을 오염시킬 수도 있습니다.

답변2

파일의 개념적 기능은 ~/.bashrc다음과 같이 모든 셸을 올바르게 시작하는 것입니다.

  • 로그인 쉘이 아닌,
  • 대화형 쉘.

분명히 이 쉘 스크립트의 기능은 쉘의 모든 레벨에서 변경되어야 하는 환경을 시작하는 것입니다(예: PS1.

세션이나 데몬 환경을 정의하는 데는 적합하지 않습니다.

이러한 유형의 사용을 위해 설계된 다른 쉘 스크립트가 있습니다.

대화형 세션의 경우 bash시작 파일은 다음 순서로 검색됩니다.

  • /etc/profile
  • ~/.bash_profile
  • ~/.bash_login
  • ~/.profile

데몬 시작과 ​​같은 비대화형 세션의 경우 bash위 파일을 사용하지 말고 전용 변수를 고려하십시오 BASH_ENV(참조:좋은 답변).

관련 정보