유닉스에서 환경변수값을 저장하는 위치는 참 많다. 전통적인 .rc , .profile 부터 .bashrc, .bash_profile , /etc/profile 등등... 너무 다양하고 시스템에 따라 쉘에만 먹혀서 그래픽 데스크탑에는 적용이 안 되기도 한다. 젠투때도 gnome세션에서 환경변수값이 안 들어가 삽질했던 기억이 난다.
우분투에서 환경변수를 어디에 저장하는 것이 좋을까? 검색어를 제대로 넣고 검색해보니 공식 안내 페이지가 있었다.
https://help.ubuntu.com/community/EnvironmentVariables#Persistent%20environment%20variables
요약하자면 사용자용 환경변수는 ~/.pam_environment 파일에 저장하고, 시스템 전체에 적용할 환경변수는 /etc/environment 파일에 저장하라는 것이다. 두 파일은 .bashrc나 .profile과는 달리 쉘스크립트가 아니라서 export명령을 빼고 쓴다는 것만 염두해두자. 그런데 이러면 조건문도 못 쓰지 않나!
보충 설명을 하자면
.profile이나 .bash_profile은 로그인쉘에서만 동작해서 일반 쉘 열 때는 안 먹히고 (하지만 보통 다른 쉘은 로그인 쉘 상태에서 자식으로 열려서 환경변수 값이 전파되기는 한다), 더 큰 문제는 그래픽 세션에는 값이 안 들어간다는 점이다. 여기에 설정한 값이 그놈 세션에 적용이 안 되서 실행 프로그램이 그 값을 못 가져온다.
.bashrc는 비 로그인 쉘로 실행될 때 실행된다고 한다. 거꾸로 말하면 로그인 쉘에서는 실행이 안 된다! 그래서 수많은 .bash_profile 샘플들을 보면 if [ -f ~/.bashrc ]; then . ~/.bashr 같은 내용이 들어있는 것이었다. 이 파일은 이름 자체가 bash로 시작하기 때문에 꼭 bash쉘을 열 때만 실행될 것 같은데, 설명을 보니 DisplayManager도 열기 때문에 세션에도 적용된다고는 나와있다. 다만 쉘 열 때마다 실행되기 때문에 성능을 생각하면 여기에 되도록 넣지 말라는 이야기다.
그런데, 애초에 이것을 조사하게 된 이유가 GDK_NATIVE_WINDOWS 라는 환경변수 때문이었다. 이전버젼은 잘 모르겠는데, 우분투 9.10에서 이클립스같은 자바 기반 프로그램이 오동작을 하는 것이다. 알아보니 GDK_NATIVE_WINDOWS환경변수 값을 1로 설정하면 제대로 돌아간다고 해서 이것을 저장해 놨는데, 실제 그놈을 띄워보면 설정이 안 되는 것이다. 그래서 환경변수가 쉘에만 전파된 것이 아닌가해서 이런저런 파일로 삽질을 했는데 현재까지의 잠정결론은 gnome이 실행하면서 그 변수를 계속 지우는 것이었다.
이클립스 하나만 이러면 그냥 래퍼쉘 스크립트로 변수설정해서 실행시키면 되겠지만, 내가 쓸 자바기반 프로그램이 한두가지여야 말이지. 설치시간 줄이려고 젠투 버리고 우분투 갈아탄 것이 정말 잘한 걸까 하는 생각이 자주 든다.
우분투에서 환경변수를 어디에 저장하는 것이 좋을까? 검색어를 제대로 넣고 검색해보니 공식 안내 페이지가 있었다.
https://help.ubuntu.com/community/EnvironmentVariables#Persistent%20environment%20variables
요약하자면 사용자용 환경변수는 ~/.pam_environment 파일에 저장하고, 시스템 전체에 적용할 환경변수는 /etc/environment 파일에 저장하라는 것이다. 두 파일은 .bashrc나 .profile과는 달리 쉘스크립트가 아니라서 export명령을 빼고 쓴다는 것만 염두해두자. 그런데 이러면 조건문도 못 쓰지 않나!
보충 설명을 하자면
.profile이나 .bash_profile은 로그인쉘에서만 동작해서 일반 쉘 열 때는 안 먹히고 (하지만 보통 다른 쉘은 로그인 쉘 상태에서 자식으로 열려서 환경변수 값이 전파되기는 한다), 더 큰 문제는 그래픽 세션에는 값이 안 들어간다는 점이다. 여기에 설정한 값이 그놈 세션에 적용이 안 되서 실행 프로그램이 그 값을 못 가져온다.
.bashrc는 비 로그인 쉘로 실행될 때 실행된다고 한다. 거꾸로 말하면 로그인 쉘에서는 실행이 안 된다! 그래서 수많은 .bash_profile 샘플들을 보면 if [ -f ~/.bashrc ]; then . ~/.bashr 같은 내용이 들어있는 것이었다. 이 파일은 이름 자체가 bash로 시작하기 때문에 꼭 bash쉘을 열 때만 실행될 것 같은데, 설명을 보니 DisplayManager도 열기 때문에 세션에도 적용된다고는 나와있다. 다만 쉘 열 때마다 실행되기 때문에 성능을 생각하면 여기에 되도록 넣지 말라는 이야기다.
그런데, 애초에 이것을 조사하게 된 이유가 GDK_NATIVE_WINDOWS 라는 환경변수 때문이었다. 이전버젼은 잘 모르겠는데, 우분투 9.10에서 이클립스같은 자바 기반 프로그램이 오동작을 하는 것이다. 알아보니 GDK_NATIVE_WINDOWS환경변수 값을 1로 설정하면 제대로 돌아간다고 해서 이것을 저장해 놨는데, 실제 그놈을 띄워보면 설정이 안 되는 것이다. 그래서 환경변수가 쉘에만 전파된 것이 아닌가해서 이런저런 파일로 삽질을 했는데 현재까지의 잠정결론은 gnome이 실행하면서 그 변수를 계속 지우는 것이었다.
이클립스 하나만 이러면 그냥 래퍼쉘 스크립트로 변수설정해서 실행시키면 되겠지만, 내가 쓸 자바기반 프로그램이 한두가지여야 말이지. 설치시간 줄이려고 젠투 버리고 우분투 갈아탄 것이 정말 잘한 걸까 하는 생각이 자주 든다.



덧글