다음을 사용하여 환경 변수를 설정했습니다 /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.bashrc
export 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