ディレクトリに移動して右クリックし、「ターミナルで開く」を選択して、Ctrl+ Alt+ Tと別のターミナルを使用してUbuntu でターミナルを開きました。
私はecho $0両方の場合でした。
最初の場合:
$ echo $0
-bash
2番目の場合:
$ echo $0
/bin/bash
なぜこの違いがありますか?
ディレクトリに移動して右クリックし、「ターミナルで開く」を選択して、Ctrl+ Alt+ Tと別のターミナルを使用してUbuntu でターミナルを開きました。
私は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.
詳細については、ログインシェルと非ログインシェルの違いをご覧ください。。
さて、/bin/bash2番目のケースに陥る理由を説明するために、プログラム(お使いの場合はファイルマネージャー、おそらくnautilus)またはスクリプトがそれ自体$0を別のものに変更できると言えます。例として$0、私の端末(常に同じ端末)で何が起こっているかを見てください:

ログインするとシェルが起動しますmakeが、シェルなどのプログラムによって起動されたり、シェルスクリプトを実行したり、と入力:shしviたり、新しいターミナルウィンドウを作成したりしたときにも起動されます。
もともと、~/.profileログインまたは実行時にシェルが読み込まれていましたsu。このスクリプトは、新しい電子メールがあるかどうかのアナウンス、消去文字と削除文字のカスタマイズ、TERM変数とPATH変数の設定とエクスポートなどを行います。他のほとんどのコンテキストで起動されたとき、シェルは~/.profileこれらのことのほとんどを行うと冗長になるため、読み取りませんでした。重要なシェル変数はすべて新しいシェルにエクスポートされているはずです。
シェルが読み込むかどうかを知る方法~/.profileはargv[0]、別名の最初の文字がであるかどうかをチェックすること$0でした'-'。
から始まるcshエイリアスが導入されました。エイリアスは環境にエクスポートされませんでした。csh2つの異なる初期化スクリプトを読み込むように設計されました。~/.loginユーザーがログインしたときにのみ読み取られ、これを行うキューはでargv[0]始まった場合'-'でした。~/.cshrcシェルが開始されるたびに読み取られました。一般に、エイリアスをに~/.cshrc、その他すべてをに配置しました~/.login。cshまた~/.logout、ほとんどの場合、画面をクリアして実行しましたfortune。
他のシェルはこれらの同じ機能を採用しました。ksh読んでいました~/.kshrc、bashで読んでいました~/.bashrc、そして、あなたの別名定義を配置したい場所をものでした。
したがって、長い話を短くするために、シェルを生成するアプリケーションは、それが「ログインシェル」である必要があるかどうかを判断し'-'ます。ほとんどの場合、対話型になるシェルはログインシェルとして起動され、シェルは引数として、またはスクリプトからいくつかのコマンドを実行することを意図しており、exitは通常のシェルです。
ただし、シェルを起動するのはアプリケーションの気まぐれ次第です。