이 질문이 모든 것을 말해 줍니다. 저는 현재 Arch Linux와 zsh를 사용하고 있지만 (적어도) VT와 xterms 모두에서 작동하고 (바람직하게는) 배포판이나 셸을 전환할 때 계속 작동하는 솔루션을 원합니다.
다양한 배포판에 대한 문서에서 이 질문에 대한 매우 다른 답변을 들었습니다. 우분투는 ".pam_environment를 사용하세요"라고 말합니다. 나는 그들이 Arch에서 권장하는 것이 쉘에 달려 있다고 생각합니다. 현재는 다 넣었어요. 윤곽쉘이 어떤 이유로든 이를 얻지 못하면(예: bash, .bash_profile이 존재하는 경우) 수동으로 가져와서 이를 대체합니다. 하지만 더 좋은 방법이 있을 것 같습니다.
답변1
불행하게도 환경 변수를 설정할 수 있는 완전히 이식 가능한 장소는 없습니다. 가장 가까운 두 파일은 다음과 같습니다.~/.profile
는 다양한 설정에서 기본적으로 작동하는 기존 위치입니다.~/.pam_environment
, 현대적이고 일반적이지만 제한된 대안입니다.
무엇을 넣을까?~/.pam_environment
~/.pam_environment
이 파일은 사용된 모든 로그인 방법으로 읽혀집니다.폴리아크릴아미드파일이 활성화됩니다. 여기에는 오늘날 대부분의 Linux 시스템이 포함됩니다.
주요 장점 ~/.pam_environment
은 (활성화된 경우) 사용자 셸이 시작되기 전에 읽기 때문에 세션 유형, 로그인 셸 및 기타 복잡성에 관계없이 작동한다는 것입니다. su -c somecommand
및 와 같은 비대화형 로그인에도 작동합니다 ssh somecommand
.
주요 제한 사항 ~/.pam_environment
은 복잡한 셸 구문이 아닌 간단한 할당만 넣을 수 있다는 것입니다. 이 파일의 구문은 다음과 같습니다.
- 파일은 한 줄씩 구문 분석됩니다.
VAR=VALUE
각 줄은 문자, 숫자, 밑줄로 구성된 VAR 형식이어야 합니다. 또 다른 형태에서는VAR DEFAULT=value
구문과 특수 변수를 사용하여 환경 변수를 확장할 수 있습니다.${VAR}
@{HOME}
@{SHELL}
#
주석을 시작하면 값에 나타날 수 없습니다.- VALUE가 포함된 경우
"
VAR은 따옴표 사이의 문자열로 설정됩니다. \$
또는\@
텍스트를 삽입$
하거나@
이스케이프된 개행 문자를 사용하여 긴 줄을 분할할 수 있습니다\
.- 공백이 없거나 따옴표가 없는 공백과 같은 구문 오류가 있는 경우
=
변수는 환경에서 제거됩니다.
따라서 장점은 ~/.pam_environment
다양한 상황에서 작동한다는 것입니다. 단점은 명령의 출력을 사용할 수 없고(예를 들어 디렉터리나 프로그램이 존재하는지 테스트하기 위해) 일부 문자( #"
, 줄 바꿈)를 값에 넣을 수 없거나 넣기가 어렵다는 것입니다.
무엇을 넣을까?~/.profile
파일에는 이식 가능한(POSIX) sh 구문이 있어야 합니다. [[ … ]]
시스템이 이러한 쉘을 /bin/sh
.
이 파일은 자동화 애플리케이션 내의 스크립트로 읽을 수 있으므로 출력이나 호출을 생성하는 프로그램을 호출해서는 안 됩니다 exec
. 텍스트 모드 로그인에서 이 작업을 수행하려면 대화형 쉘에서만 수행하십시오. 예:
case $- in *i*)
# Display a message if I have new mail
if mail -e; then echo 'You have new mail'; fi
# If zsh is available, and this looks like a text-mode login, run zsh
case "`ps $PPID` " in
*" login "*)
if type zsh >/dev/null 2>/dev/null; then exec zsh; fi;;
esac
esac
/bin/sh
다음은 로그인 셸로 사용하고 즐겨 사용하는 셸로 전환하는 예입니다. 당신은 또한 볼 수 있습니다시스템 관리자가 로그인 쉘 변경을 거부할 때 bash를 로그인 쉘로 사용하는 방법
~/.profile
비그래픽 로그인 중에 읽히지 않는 경우는 언제입니까?
다른로그인 쉘다른 파일을 읽으십시오.
로그인 쉘이 bash인 경우
Bash는 존재하는 경우 읽 ~/.bash_login
거나 읽지 않습니다 . 또한 Bash가 대화형인 경우에도 로그인 쉘의 내용을 읽지 않습니다. 이러한 문제를 다시는 기억하지 않으려면 다음 두 줄을 사용하여 하나를 만드세요.~/.bash_profile
~/.profile
~/.bashrc
~/.bash_profile
. ~/.profile
case $- in *i*) . ~/.bashrc;; esac
당신은 또한 볼 수 있습니다Bash를 사용하여 환경 변수를 설정하려면 어떤 설정 파일을 사용해야 합니까?
로그인 쉘이 zsh인 경우
~/.zprofile
Zsh는 및 를 읽지 ~/.zlogin
만 그렇지 않습니다 ~/.profile
. zsh의 구문은 sh와 다르지만 ~/.profile
sh 에뮬레이션 모드에서 읽을 수 있습니다. 다음 용도로 사용할 수 있습니다 ~/.zprofile
.
emulate sh -c '. ~/.profile'
당신은 또한 볼 수 있습니다Zsh가 ~/.profile을 클릭하지 않습니다.
로그인 쉘이 다른 쉘인 경우
/bin/sh
로그인 셸로 사용하고 즐겨 사용하는 셸(예: Fish)을 대화형 셸로 사용하는 것 외에는 할 수 있는 일이 많지 않습니다. 이것이 제가 zsh로 하는 일입니다. 다른 쉘을 호출하는 위의 예를 참조하십시오 ~/.profile
.
원격 명령
대화형 쉘 없이 원격 명령을 호출하면 모든 쉘이 시작 파일을 읽지는 않습니다.
ENV
변수를 전달하면 Ksh는 변수에 지정된 파일을 읽습니다.
Bash는 ~/.bashrc
다음과 같은 경우 읽습니다.대화형이 아님(!) 및 해당 상위 프로세스를 rshd
또는 이라고 합니다 sshd
. 그래서 당신은 ~/.bashrc
당신의 일을 시작할 수 있습니다
if [[ $- != *i* ]]; then
. ~/.profile
return
fi
~/.zshenv
Zsh는 시작 시 항상 읽습니다. 다른 변수를 설정하는 하위 쉘인 경우에도 zsh의 모든 인스턴스가 이를 읽으므로 주의해서 사용하십시오. zsh가 로그인 셸이고 이를 원격 명령에 대한 변수를 설정하는 데만 사용하려면 가드를 사용하세요. ~/.profile
예를 들어 에서 일부 변수를 설정 MY_ENVIRONMENT_HAS_BEEN_SET=yes
하고 읽기 전에 이 가드를 확인하세요 ~/.profile
.
if [[ -z $MY_ENVIRONMENT_HAS_BEEN_SET ]]; then emulate sh -c '~/.profile'; fi
그래픽 로그인 사례
많은 배포판, 디스플레이 관리자 및 데스크탑 환경에서는 ~/.profile
시작 스크립트에서 명시적으로 가져오거나 로그인 셸을 실행하여 실행되도록 예약합니다.
~/.profile
불행하게도 읽지 않은 distro/DM/DE 조합을 처리하는 보편적인 방법은 없습니다 .
에 의해 시작된 기존 세션을 사용하는 경우 여기에서 소싱(예:)을 통해 ~/.xsession
환경 변수를 설정해야 합니다 . 일부 설정에서는 데스크탑 환경 시작 스크립트가 소스를 다시 가져옵니다.~/.profile
. ~/.profile
~/.profile
답변2
내가 아는 한, 환경 변수를 설정하는 방법에 대한 배포 및 쉘 독립적인 표준은 없습니다.
가장 일반적이고 사실상의 표준은 /etc/profile
및 입니다 ~/.profile
. 두 번째로 가장 흔한 것은 /etc/environment
및 입니다 ~/.pam_environment
.
내가 찾은 모든 문서도 당신도 찾은 것 같습니다. 그럼에도 불구하고 다른 독자들의 참고를 위해 여기에 나열합니다.
- 데비안 권장
/etc/profile
및~/.profile
(협회). - 우분투 권장
/etc/environment
및~/.pam_environment
(협회). - Arch Linux는 무엇보다도 다음을 언급
/etc/profile
합니다 ./etc/environment
협회).
/etc/environment
보너스: 데비안에서 사용되거나 남용되는 질문 텍스트(협회, 마지막 업데이트: 2008).
답변3
답변4
다음 스크립트 ~/bin/agnostic_setenv를 추가했습니다.
#!/bin/csh -f
set args = ($*)
if ($#args == 1) then
echo "export $args[1]="
exit 0
endif
if ($#args == 2) then
if ("$args[1]" =~ *csh*) then
echo "setenv $args[2]"
exit 0
else
echo "export $args[1]=$args[2]"
exit 0
endif
endif
echo "setenv $args[2] $args[3]"
~/.perl-homedir에서는 다음을 사용합니다.
eval `${HOME}/bin/agnostic_setenv $shell PERL_HOMEDIR 0`
agnostic_unsetenv에 대한 유사한 스크립트:
#!/bin/csh -f
set args = ($*)
if ($#args == 1) then
echo "export $args[1]"
exit 0
endif
echo "unsetenv $args[2]"
exit 0