echo $SHELL が常に /bin/bash を表示するのはなぜですか? [コピー]

echo $SHELL が常に /bin/bash を表示するのはなぜですか? [コピー]

ここでは説明があまりありません。別のシェルに切り替えても、echo $SHELL が常に /bin/bash に出力を提供する理由は疑問です。 $ SHELLが現在の場所に正しいシェルパスを提供していることを確認するにはどうすればよいですか?

[root@localhost user]# echo $0
bash
[root@localhost user]# echo $SHELL
/bin/bash
[root@localhost user]# csh
[root@localhost user]# echo $0
csh
[root@localhost user]# echo $SHELL
/bin/bash
[root@localhost user]# tcsh
[root@localhost user]# echo $0
tcsh
[root@localhost user]# echo $SHELL
/bin/bash
[root@localhost user]# sh
sh-4.2# echo $0
sh
sh-4.2# echo $SHELL
/bin/bash
sh-4.2# 
[root@localhost user]# which csh
/bin/csh
[root@localhost user]# which csh
/bin/csh

ベストアンサー1

$SHELL~である環境変数を保存好みのエンクロージャは現在実行中のシェルではありません。loginログインできる他のアプリケーションによって初期化されます。シェルデータベース内のユーザーエントリのフィールドpasswd(あなたのログインシェル)。

xtermこの変数は、たとえば、アプリケーションがvimシェルを起動するときにどのシェルを起動する必要があるかを知らせるために使用されます。通常、データベースに設定されているシェル以外のシェルを使用したい場合は、それを変更できますpasswd

現在のシェルのインタプリタへのパスを取得するには、LinuxでBourneやcshなどのシェルを使用して次のことを実行できます。

readlink "/proc/$$/exe"

同等rc

readlink /proc/$pid/exe

同等fish

set pid %self
readlink /proc/$pid/exe

csh/tcsh は$shell変数をシェルパスに設定します。

Bourneなどのシェルには、$0シェルが受け取った最初の引数(argv[0])が含まれます。これは慣例的に呼び出されるコマンドの名前です(loginアプリケーションは慣例的に最初の文字aを再使用して、-これがAログインであることをシェルに通知します)。たとえば、インタプリタスクリプトや追加の引数なしで呼び出されると、ログインセッションのカスタマイズを含むファイルまたはファイルをインポートする必要があります.profile.loginshell -c '...'

存在する:

$ bash -c 'echo "$0"'
bash
$ /bin/bash -c 'echo "$0"'
/bin/bash

私のシェルは/bin/bash両方のケースで呼び出されますが、bash最初のケースでは最初の引数として使用され、2番目のケースではランダムな/bin/bash文字列渡しを可能にするいくつかのシェルがあります。

$ (exec -a whatever bash -c 'echo "$0"')
whatever

ksh/bash/zsh/yashにあります。

おすすめ記事