次の結果がわかりません。
/tmp/% /usr/bin/env -i /bin/bash --norc --noprofile
bash-5.0$ echo $PATH
/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:.
私はPATH
それが空になると期待した。
実際、ある程度は次のようになります。
bash-5.0$ /usr/bin/printenv
PWD=/tmp
SHLVL=1
_=/usr/bin/printenv
PATH
だからない環境しかし、まだnull以外のPATH
変数を定義し、シェルはそれを使用してコマンドを解析できます。
bash-5.0$ which ls
/bin/ls
私は次のように強制的にnullを/usr/bin/env
作成できることに気づきましたPATH
。
/tmp/% /usr/bin/env -i PATH= /bin/bash --norc --noprofile
bash-5.0$ /usr/bin/printenv
PWD=/tmp
SHLVL=1
PATH=
_=/usr/bin/printenv
bash-5.0$ echo $PATH
bash-5.0$
このアプローチには2つの問題があります。 1)出力PATH
から完全に消えることをお勧めします。 2)上記の状況は、後で作成されたシェルセッションの多くの変数がまだ定義されています。/usr/bin/printenv
PATH
/usr/bin/env -i
尋ねる:/bin/bash
環境に関係なく、定義された変数をできるだけ少なく使用して対話型セッションを開始する最も簡単な方法は何ですか?1
(この質問を表現するためにこの単語を使用しましたが、bash
それに関する関連情報にも興味がありますzsh
。)
一部の変数が定義されていないと、多くのプログラムが正しく実行されないか、まったく実行されないことがわかります。トラブルシューティング、診断など以外の目的でこれらの小さなシェルセッションを使用するつもりはありません。
ベストアンサー1
はい、起動時に受信した環境で提供されていない場合、両方bash
(zsh
およびdash
少なくとも)mksh
がデフォルト値に設定されます。fish
$PATH
サポートされていないPOSIXシェルはまだデフォルトの検索パスでコマンドを見つける必要があります。
(bash
およびzsh
自動的にロードされたり、後者にロードされない一部のモジュール)は、複数の内部変数を設定します。そのうちのいくつかは環境にエクスポートされ(PATH
および場合ではありません)、一部は読み取り専用です。bash
zsh
env -i zsh -f
または、env -i bash --norc
シェルが空の環境で実行されます。
読み取り専用以外の設定を解除するにはunset ${(k)parameters}
inzsh
またはunset -v $(compgen -v)
inで実行できます(消えないbash
場合は2回実行する必要がありますが)。LINES
COLUMNS
私のテストでは、bash
まだ次のように残っています。
<noprompt> typeset -p
declare -r BASHOPTS="checkwinsize:cmdhist:complete_fullquote:expand_aliases:extquote:force_fignore:globasciiranges:hostcomplete:interactive_comments:progcomp:promptvars:sourcepath"
declare -a BASH_ARGC=([0]="0")
declare -a BASH_ARGV=()
declare -a BASH_LINENO=()
declare -a BASH_SOURCE=()
declare -ar BASH_VERSINFO=([0]="5" [1]="0" [2]="17" [3]="1" [4]="release" [5]="x86_64-pc-linux-gnu")
declare -ir EUID="1000"
declare -a FUNCNAME
declare -x OLDPWD
declare -a PIPESTATUS=([0]="1")
declare -ir PPID="44873"
declare -r SHELLOPTS="braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor"
declare -ir UID="1000"
declare -- _="_"
そしてzsh
:
<noprompt> printf '%s (%s)\n' ${(kv)parameters}
parameters (association-readonly-hide-hideval-special)
HISTCMD (integer-readonly-special)
! (integer-readonly-special)
# (integer-readonly-special)
$ (integer-readonly-special)
* (array-readonly-special)
- (scalar-readonly-special)
0 (scalar-special)
ZSH_EVAL_CONTEXT (scalar-readonly-tied-special)
ZSH_SUBSHELL (integer-readonly-special)
? (integer-readonly-special)
@ (array-readonly-special)
zsh_eval_context (array-readonly-tied-special)
status (integer-readonly-special)
TTYIDLE (integer-readonly-special)
LINENO (integer-readonly-special)
PPID (integer-readonly-special)
ARGC (integer-readonly-special)