환경 변수를 설정하는 가장 좋은 distro/shell 독립적 방법은 무엇입니까?

환경 변수를 설정하는 가장 좋은 distro/shell 독립적 방법은 무엇입니까?

이 질문이 모든 것을 말해 줍니다. 저는 현재 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인 경우

~/.zprofileZsh는 및 를 읽지 ~/.zlogin만 그렇지 않습니다 ~/.profile. zsh의 구문은 sh와 다르지만 ~/.profilesh 에뮬레이션 모드에서 읽을 수 있습니다. 다음 용도로 사용할 수 있습니다 ~/.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

~/.zshenvZsh는 시작 시 항상 읽습니다. 다른 변수를 설정하는 하위 쉘인 경우에도 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

당신이 사용하는 경우시스템 호스트, 당신은 사용할 수 있어야합니다homectl쉘에 관계없이 사용자 계정에 대한 환경 변수를 설정하십시오. 다음 명령은 EDITOR이러한 방식으로 환경 변수를 설정합니다.

homectl update username --setenv=EDITOR=/usr/bin/vim

답변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

관련 정보