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