유닉스 서비스에서 환경 변수를 확인하는 방법은 무엇입니까?

유닉스 서비스에서 환경 변수를 확인하는 방법은 무엇입니까?

다음을 사용하여 환경 변수를 설정했습니다 /etc/profile.

export VAR=/home/userhome

그리고 내가 echo $VAR이렇게 하면 다음과 같이 표시될 것입니다./home/userhome

하지만 이 변수에 대한 참조를 파일에 넣으면 /etc/init.d/servicename변수를 찾을 수 없습니다. 다음을 포함하는 파일 service servicename status로 실행할 때 :/etc/init.d/servicename

case "$1" in
status)    
    cd $VAR/dir
    ;;
esac

그것은 말한다/dir: No such file or directory

하지만 내가 /etc/init.d/servicename status대신 달리면service servicename status

유닉스 서비스에서 환경 변수를 확인하는 방법은 무엇입니까?

답변1

문제는 를 service제외한 모든 환경 변수를 제거하는 것 입니다 TERM. PATH이는 LANG좋은 일입니다. 스크립트를 직접 실행하면 환경변수가 삭제되지 않으므로 모든 것이 잘 동작합니다.

환경 변수가 시작 시 존재하지 않고 초기화 시스템이 이를 설정하지 않을 수 있으므로 외부 환경 변수에 의존하고 싶지 않습니다.

여전히 그러한 변수에 의존하고 싶다면 파일을 가져와서 변수를 읽으십시오. 예를 들어 다음을 /etc/default/servicename사용하십시오.

VAR=value

다음과 같이 초기화 스크립트에서 가져옵니다.

[ -f /etc/default/service-name ] && . /etc/default/service-name

if [ -z "$VAR" ] ;  then
  echo "VAR is not set, please set it in /etc/default/service-name" >&2
  exit 1
fi

case "$1" in
status)    
    cd "$VAR"/dir
    ;;
esac

답변2

제 경우에는 :에 하나를 설정해야 했습니다 RAILS_ENV. 스크립트에서 사용할 수 있도록 변수를 추가했습니다. 파일의 나머지 부분을 포함할 필요가 없도록 이렇게 했습니다./etc/bash.bashrcexport RAILS_ENV=staging$(grep RAILS_ENV /etc/bash.bashrc)

답변3

하나못생긴또한 유효한 솔루션:

function exec() {
    args=( $@ )
    command=${args[0]}
    dummy=${args[1]}
    whoami=`whoami`
    if [ -z "$dummy" ]; then
        me=`basename $0`
        runuser -l ${whoami} -c "bash /etc/init.d/${me} ${command} dummy"
    else
       printenv
   fi
}

case $1 in
    status)
        status
        ;;
    start|stop|kill|restart)
        exec $*
        ;;
    *)
        usage
esac

관련 정보