
내가 이해한 바에 따르면 데몬은 백그라운드 프로세스이지만 환경 변수를 설정하려면 데몬에 고유한 구성 파일이 필요합니다.
예를 들어 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
(참조:좋은 답변).