Ubuntuでターミナルを開いた Ctrl+Alt+T ディレクトリに移動して右クリックし、[ターミナルで開く]を選択すると、別のターミナルが表示されます。
echo $0
両方の場合において。
最初のケースでは:
$ echo $0
-bash
2番目の場合:
$ echo $0
/bin/bash
なぜこの違いがあるのですか?
echo $0
コマンドの出力が-bash
の場合、bash
がログインシェルとして呼び出されたことを意味します。出力がbash
のみの場合は、ログインしていないシェルを使用しています。
man bash
は、126行目のどこかで述べています。
A login Shell is one whose first character of argument zero is a -, or one started with the --login option.
詳細については、こちらをご覧ください ログインシェルと非ログインシェルの違い? 。
さて、2番目のケースで/bin/bash
を取得する理由を説明するために、プログラム(あなたの場合はファイルマネージャー、おそらくnautilus)またはスクリプトが独自の$0
を別のものに変更できると言えます。例として、私の端末(常に同じ端末)で$0
で何が起こっているかを確認します。
違いは、これらの開始方法にあります。 bashは、argv [0]に応じて異なる方法で初期化されます(異なる起動スクリプトを読み取ります)。文字列が-
のようにハイフン-bash
で始まる場合は、ログインシェルとして実行され、そうでない場合はインタラクティブシェルとして実行されます。また、非対話型シェル(つまり、シェルスクリプト内)として実行することもできます。
詳細については、マニュアルのman bash
INVOCATIONセクションを読むことをお勧めします。
シェルはログインしたときに開始されますが、make
などのプログラムによって、またはシェルスクリプトを実行したとき、または:sh
to vi
を入力したとき、または新しいターミナルウィンドウを作成します。
本来、シェルは、ログインまたはsu
を実行したときに~/.profile
を読み取りました。このスクリプトは、新しい電子メールが届いたかどうかを知らせ、消去文字と削除文字をカスタマイズし、TERM変数とPATH変数を設定してエクスポートするようなものです。他のほとんどのコンテキストで起動したとき、シェルは~/.profile
を読み取れませんでした。これらのほとんどの作業は冗長になるためです。重要なシェル変数を新しいシェルにエクスポートしたはずです。
シェルが~/.profile
を読み取るかどうかを知る方法は、argv[0]
の最初の文字(別名$0
)が'-'
かどうかを確認することでした。
csh
以降、エイリアスが導入されました。エイリアスは環境にエクスポートされませんでした。 csh
は、2つの異なる初期化スクリプトを読み取るように設計されています。 ~/.login
は、ユーザーがログインしたときにのみ読み取られました。これを行うきっかけは、argv[0]
が'-'
で始まっていた場合です。 ~/.cshrc
は、シェルが起動されるたびに読み取られました。一般に、エイリアスは~/.cshrc
に配置し、その他はすべて~/.login
に配置しました。 csh
は~/.logout
もサポートしています。これはほとんどの場合、画面をクリアしてfortune
を実行しただけです。
他のシェルはこれらと同じ機能を採用しています。 ksh
は~/.kshrc
を読み取り、bash
は~/.bashrc
を読み取り、それらがエイリアス定義を配置する場所でした。
したがって、話を簡単に言うと、シェルを生成するアプリケーションは、それが「ログインシェル」であるかどうかを判断します。この場合、最初に'-'
が存在するか、通常のシェルが存在します。ほとんどの場合、対話型になるシェルはログインシェルとして起動され、シェルは引数としてまたはスクリプトからいくつかのコマンドを実行するためのものであり、通常のシェルです。
しかし、それはすべて、シェルを起動するアプリケーションの気まぐれ次第です。