$USER 및 $USERNAME 환경 변수는 누가 설정합니까?

$USER 및 $USERNAME 환경 변수는 누가 설정합니까?

또한 이 변수는 항상 현재 로그인된 사용자 이름(내 Debian 시스템)과 일치합니까? 다른 Unix(유사한) 시스템에서도 사용할 수 있다고 가정할 수 있습니까?

whoami또한 사람들이 왜 이러한 변수를 읽는 대신 사용하는지 궁금합니다 .

답변1

그것은로그인.

리눅스로그인(1)매뉴얼 페이지에는 다음과 같이 나와 있습니다.

의 가치$HOME,$user,$쉘,$경로,$로그 이름, 그리고 $mail비밀번호 입력의 해당 필드에 따라 설정하십시오.

FreeBSD로그인(1)매뉴얼 페이지에는 다음과 같이 나와 있습니다.

이것로그인유틸리티는 환경에 정보를 입력합니다(참조: 환경(7)) 사용자의 홈 디렉터리(HOME), 명령 해석기(SHELL), 검색 경로(PATH), 터미널 유형(TERM) 및 사용자 이름(LOGNAME 및 USER)을 지정합니다.

이것네트워크BSD,오픈BSD그리고운영 체제매뉴얼 페이지에도 같은 내용이 나와 있습니다.

이것은소스 코드util-linux에서 로그인합니다:

setenv("HOME", pwd->pw_dir, 0); /* legal to override */
setenv("USER", pwd->pw_name, 1);
setenv("SHELL", pwd->pw_shell, 1);
/* ... */
setenv("LOGNAME", pwd->pw_name, 1);

이것은소스 코드FreeBSD에서 로그인:

(void)setenv("LOGNAME", username, 1);
(void)setenv("USER", username, 1);
(void)setenv("PATH", rootlogin ? _PATH_STDPATH : _PATH_DEFPATH, 0);

답변2

규칙이 없습니다. 일부 쉘은 tcsh또는 zshset 과 같습니다 $LOGNAME. zsh설정 $USERNAME(허용되는 경우 변수에 값을 할당하여 uids/gid를 사용자의 값으로 변경할 수도 있습니다).

그래픽 로그인 관리자(터미널에 로그인할 때 호출되며 login때로는 그래픽 로그인 관리자와 같은 다른 항목에 의해 호출됨)와 같이 로그인하는 항목에 의해 설정될 수도 있고 그렇지 않을 수도 있습니다.gettyin.rlogindcronsusudosshdrshd

로그인이 있으면 $USER일반적으로 설정됩니다(그러나 해당 로그인 세션 내에서 사용자 ID를 변경한 후에는 업데이트되지 않을 수 있습니다(setuid 명령을 통해)). POSIX에서는 $LOGNAME로그인 시 설정해야 합니다 cron.

이식 가능한 로그인을 얻으려면 이 명령을 사용하는 것이 좋습니다 logname(로그인이 없으면 아무 것도 반환하지 않을 수 있습니다). 사용자 ID를 얻으려면 다음을 사용하세요 id -u. 현재 유효한 사용자 ID에 해당하는 사용자 이름을 얻으세요: id -un.이 모든 정보를 얻으려면(대부분의 경우 사용자 ID당 하나의 사용자 이름만 있지만 이것이 보장되지는 않습니다):

perl -le 'while ($n = getpwent()) {print $n if getpwnam($n) == $>}'

하지만 이는 사용자 데이터베이스를 열거할 수 없는 시스템(예: 네트워크 사용자 데이터베이스에서 발생하는 경우)에서는 작동하지 않을 수 있습니다.

답변3

당신은 의지하고 싶을 수도 있습니다POSIX어떤 시점에서는 사용자 로그인(프로그램에 의해 관리됨 login)뿐만 아니라 cron작업 등에 관심을 가질 수 있기 때문에 이는 표준입니다.

$LOGNAME따라서 POSIX에서는 가 필요 하지만 필요하지는 않다는 점을 알아야 합니다 $USER. 예를 들어 $USER다음과 같이 cron에 의해 설정되지 않을 수 있습니다.키스 톰슨의 답변, 또한 이것이 BSD를 사용한 System-V의 역사와 어떻게 관련되는지에 대한 몇 가지 역사를 인용합니다.

...적어도 내 시스템(Ubuntu 14.04)에서는 $USER 환경 변수가 cron 작업에 대해 설정되지 않았습니다. 대신 cron 작업 환경의 일부인 $LOGNAME을 사용할 수 있습니다.

~에 따르면환경(7)매뉴얼 페이지(읽으려면 man Environ 입력), $USER는 BSD 파생물에서 사용되고, $LOGNAME은 System-V 파생물에서 사용됩니다.

답변4

whoami환경 변수( OR getpwent및 대신)를 사용하고 getpwnam모든 *NIX 시스템에서 항상 동일한 방식으로 설정되는지 확실하지 않은 경우 bash에서 다음을 시도하십시오.

THIS_USER=${USER:-${USERNAME:-${LOGNAME}}}
echo ${THIS_USER}

여전히 비어 있다면 꽤 난해한 시스템에 있는 것입니다. ;)

관련 정보