env -i bash를 사용하여 Bash 셸을 시작할 때 PATH 변수 세트는 어디에 있습니까?

env -i bash를 사용하여 Bash 셸을 시작할 때 PATH 변수 세트는 어디에 있습니까?

/etc/environment,,, 등 여러 구성 파일을 읽거나 실행하여 환경 변수가 설정된다는 것을 알고 있습니다./etc/profile~/.profile~/.bashrc

하지만 내가 읽을 때이 블로그 게시물, 환경을 가져오지 않고 로그인하지 않은 대화형 bash 셸을 시작하기 위해 다음 명령을 사용해 보았습니다.

 osboxes@osboxes:~$ env -i bash

PATH새 셸에 들어간 후 변수를 확인 하고 다음과 같은 결과를 얻었습니다.

osboxes@osboxes:/home/osboxes$ echo $PATH
/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:.

내가 아는 한, 이 비로그인 대화형 셸은 or 를 읽 /etc/environment거나 가져오지 않으며 합계 만 제공합니다 ./etc/profile~/.profile/etc/bash.bashrc~/.bashrc

PATH그렇다면 이 쉘 세트의 변수는 어떻게 구성되어 있습니까? 읽거나 소스로 사용할 특정 파일이 있습니까?

답변1

printenvPATH에 값이 없는지 확인하십시오 . 무언가를 찾으면 아마도 당신의 것에서 온 것일 것입니다 ~/.bashrc. 비어 있다면 Bash 자체에 의해 설정됩니다. 쉘이 시작될 때 PATH 값을 찾을 수 없으면 값을 설정합니다. PATH가 없으면 거의 아무것도 작동하지 않기 때문입니다.

소스 코드에서 이것이 어떻게 수행되는지 확인할 수 있습니다(Bash 4.4의 소스 코드를 보고 있습니다).

존재하다variables.c:

  /* Now make our own defaults in case the vars that we think are
     important are missing. */
  temp_var = set_if_not ("PATH", DEFAULT_PATH_VALUE);
#if 0
  set_auto_export (temp_var);   /* XXX */
#endif

존재하다config-top.h표시된 PATH와 일치하는 정의를 찾을 수 있습니다.

/* The default value of the PATH variable. */
#ifndef DEFAULT_PATH_VALUE
#define DEFAULT_PATH_VALUE \
  "/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:."
#endif

.나는 PATH를 넣는 것이 실수로 일을 하기 쉽기 때문에 일반적으로 나쁜 습관으로 간주된다고 생각합니다 !

답변2

PATHBourne Again 쉘 매뉴얼에 설명되어 있듯이 쉘 변수를 초기화하는 환경 변수가 없고 PATH시작 스크립트에서 쉘 변수가 설정되지 않은 경우 쉘 변수는 기본값을 갖습니다.

매뉴얼에 따르면 "설치된 시스템 관리자 bash"에 따라 값이 달라집니다. 실제로 소스에서 Bourne Again 쉘을 컴파일한 사람이 어떤 옵션을 선택했는지에 따라 달라집니다.

  • Debian의 Bourne Again 쉘 패키지에서는 매뉴얼의 기본 예에 가깝습니다:
    % unsetenv PATH `명령 -v bash` -c 'echo $PATH printenv 경로'
    /usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:.
    %
  • Bourne Again 쉘의 OpenBSD 포트/패키지는 동일합니다:
    $ unsetenv PATH `명령 -v bash` -c 'echo $PATH printenv 경로'
    /usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:.
    $
  • Bourne Again 셸의 FreeBSD 포트/패키지에서는 다소 손상되었습니다.
    % unsetenv PATH `명령 -v bash` -c 'echo $PATH printenv 경로'
    /sbin:/bin:/usr/sbin:/usr/bin:/usr/games:%%LOCALBASE%%/sbin:%%LOCALBASE%%/bin
    %
    2017년 3월에 우리는 소프트웨어 구축에 사용된 컴파일러 옵션을 조정하여 조정했습니다.

printenv어떤 줄도 인쇄되지 않는다는 사실은 이 기본 PATH쉘 변수가 환경 변수로 내보내지지 않는다는 것을 의미합니다.

관련 정보