알아요
/usr/bin/env -i /bin/bash --login --norc --noprofile
실제로 위 명령을 실행하고 printenv
새 셸 세션에서 실행한 직후에 보면 거의 아무것도 표시되지 않습니다.출구변수 정의:
% /usr/bin/env -i /bin/bash --login --norc --noprofile
bash-4.4$ printenv | /usr/bin/perl -lpe 's/=.*//'
PWD
SHLVL
_
bash-4.4$
하지만 를 실행하면 set
많은 변수가 표시됩니다.
bash-4.4$ set | /usr/bin/perl -lpe 's/=.*//'
BASH
BASHOPTS
BASH_ALIASES
BASH_ARGC
BASH_ARGV
BASH_CMDS
BASH_LINENO
BASH_SOURCE
BASH_VERSINFO
BASH_VERSION
COLUMNS
DIRSTACK
EUID
GROUPS
HISTFILE
HISTFILESIZE
HISTSIZE
HOSTNAME
HOSTTYPE
IFS
LINES
MACHTYPE
MAILCHECK
OPTERR
OPTIND
OSTYPE
PATH
PPID
PS1
PS2
PS4
PWD
SHELL
SHELLOPTS
SHLVL
TERM
UID
_
bash-4.4$
이 질문을 위해정의쉘 변수는 "필수"이며 bash
변수가 존재하지 않는 한( 의 출력에 나타나는 대로) 전혀 실행되지 않습니다. set
예를 들어, PPID
외모는 필수입니다. ( bash
누군가 이 작업을 시도하면 오류가 발생합니다 unset
.)
꼭 필요한 변수만 저장하기 위해 정의된 변수 집합을 줄이는 가장 간단한 방법은 무엇입니까?
답변1
set
"깨끗한" 쉘(상속을 통해 환경 변수가 설정되지 않고 쉘 시작 파일이 읽혀지지 않음)에서 실행될 때 출력되는 모든 쉘 변수는 쉘 자체에 의해 설정됩니다. bash(1)
설명서( ) 에도 설명되어 있습니다 man bash
.
예를 들어, 이 PPID
변수는 다음과 같이 기록됩니다.
쉘 상위 프로세스의 프로세스 ID입니다. 이 변수는 읽기 전용입니다.
예를 들어 일부 항목은 PPID
변경하거나 설정 해제할 수 없습니다. 예를 들어, 다른 변수는 SECONDS
설정을 해제하고 변경할 수 있습니다(이렇게 하면 해당 변수는 더 이상 "특별"하지 않습니다).
이러한 셸 변수는 기본적으로 내보내지지 않으므로 하위 프로세스는 이를 상속하지 않습니다. 따라서 실제로 이러한 변수를 "정리"할 필요가 없습니다.