わかりました
/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
設定を無効にして変更できます(これにより、その変数はもはや「特別」になりません)。
これらのシェル変数はデフォルトではエクスポートされないため、子プロセスはそれを継承しません。したがって、実際にこれらの変数を「クリーンアップ」する必要はありません。