web-dev-qa-db-ja.com

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
17
Shashank Vyas

$Shell環境変数です優先シェルを保持し、現在実行中のシェルではありません。 loginデータベース内のユーザーエントリのShellフィールドに基づいてログインするpasswdまたはその他のアプリケーションによって初期化されます(your login Shell)。

この変数は、xtermvim...などのアプリケーションに、シェルを起動したときにどのシェルを起動するかを指示するために使用されます。通常は、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アプリケーションでも、規則では、最初の文字を-にして、シェルにログインシェルであることを伝えます。たとえば、スクリプトを解釈するために呼び出されない場合は、ログインセッションのカスタマイズを含む.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内。

35

echo $0コマンドの出力が-bashの場合、bashがログインシェルとして呼び出されたことを意味します。出力がbashのみの場合は、ログインしていないシェルを使用しています。

ENVがトリガーされて目的の出力が表示されるため、/bin/bash

[root@dcconnect ~]# env | grep -i Shell
SHELL=/bin/bash

echo #Shellの出力はENV変数から取得されます

2
Mongrel

$0は、シェルを起動したコマンドです。 $Shellは、システムのデフォルトのシェルです

0
Pascal Fares