ここでは説明があまりありません。別のシェルに切り替えても、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
。.login
shell -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にあります。
答え2
コマンドの出力がecho $0
-bashの場合、これはbashがログインシェルとして呼び出されることを意味します。出力がbash専用の場合は、非ログインのシェルにあります。
ENV
目的の出力を表示するようにトリガされると/bin/bash
[root@dcconnect ~]# env | grep -i SHELL
SHELL=/bin/bash
出力は変数から抽出さecho #SHELL
れます。ENV
答え3
$0
シェルを起動するコマンドです。$SHELL
システムの基本シェルです。