최소한의 정의된 변수로 셸 세션을 얻는 방법(모든 기능과 일치)

최소한의 정의된 변수로 셸 세션을 얻는 방법(모든 기능과 일치)

알아요

/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설정을 해제하고 변경할 수 있습니다(이렇게 하면 해당 변수는 더 이상 "특별"하지 않습니다).

이러한 셸 변수는 기본적으로 내보내지지 않으므로 하위 프로세스는 이를 상속하지 않습니다. 따라서 실제로 이러한 변수를 "정리"할 필요가 없습니다.

관련 정보