/usr/bin/env -i /bin/bash --norc --noprofile 以降の PATH は空ではありません。

/usr/bin/env -i /bin/bash --norc --noprofile 以降の PATH は空ではありません。

次の結果がわかりません。

/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/printenvPATH/usr/bin/env -i

尋ねる:/bin/bash環境に関係なく、定義された変数をできるだけ少なく使用して対話型セッションを開始する最も簡単な方法は何ですか?1

(この質問を表現するためにこの単語を使用しましたが、bashそれに関する関連情報にも興味がありますzsh。)


一部の変数が定義されていないと、多くのプログラムが正しく実行されないか、まったく実行されないことがわかりますトラブルシューティング、診断など以外の目的でこれらの小さなシェルセッションを使用するつもりはありません。

ベストアンサー1

はい、起動時に受信した環境で提供されていない場合、両方bashzshおよびdash少なくとも)mkshがデフォルト値に設定されます。fish$PATH

サポートされていないPOSIXシェルはまだデフォルトの検索パスでコマンドを見つける必要があります。

bashおよびzsh自動的にロードされたり、後者にロードされない一部のモジュール)は、複数の内部変数を設定します。そのうちのいくつかは環境にエクスポートされ(PATHおよび場合ではありません)、一部は読み取り専用です。bashzsh

env -i zsh -fまたは、env -i bash --norcシェルが空の環境で実行されます。

読み取り専用以外の設定を解除するにはunset ${(k)parameters}inzshまたはunset -v $(compgen -v)inで実行できます(消えないbash場合は2回実行する必要がありますが)。LINESCOLUMNS

私のテストでは、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)

おすすめ記事