「echo $ 0」が2つの異なる端末に対して異なる結果を与えるのはなぜですか?


15

ディレクトリに移動して右クリックし、「ターミナルで開く」を選択して、Ctrl+ Alt+ Tと別のターミナルを使用してUbuntu でターミナルを開きました。

私はecho $0両方の場合でした。

最初の場合:

$ echo $0
-bash

2番目の場合:

$ echo $0
/bin/bash

なぜこの違いがありますか?


$ 0は、実行中のプロセスの名前を返します。
ラメシュ14

異なるユーザーで2つの端末を実行していますか?
クオンルム14

私は、同じユーザー使用
CodeBlue


それらは実際には異なる端末エミュレーターですか、それとも同じ端末エミュレーターの2つのインスタンスですか?それらは両方ともデフォルトの端末ですか?
テルドン

回答:


16

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、私の端末(常に同じ端末)で何が起こっているかを見てください:

ここに画像の説明を入力してください


12

違いは、これらが開始された方法にあります。bashは、argv [0]に応じて異なる方法で初期化されます(異なる起動スクリプトを読み取ります)。文字列がハイフンで始まる場合-のように-bashされていない場合には、ログインシェルとして実行され、その後、それは対話的シェルとして実行されます。また、非対話型シェルとして(つまり、シェルスクリプトで)実行することもできます。

詳細については、マニュアルのman bash「呼び出し」セクションを参照することをお勧めします。


9

ログインするとシェルが起動しますmakeが、シェルなどのプログラムによって起動されたり、シェルスクリプトを実行したり、と入力:shviたり、新しいターミナルウィンドウを作成したりしたときにも起動されます。

もともと、~/.profileログインまたは実行時にシェルが読み込まれていましたsu。このスクリプトは、新しい電子メールがあるかどうかのアナウンス、消去文字と削除文字のカスタマイズ、TERM変数とPATH変数の設定とエクスポートなどを行います。他のほとんどのコンテキストで起動されたとき、シェルは~/.profileこれらのことのほとんどを行うと冗長になるため、読み取りませんでした。重要なシェル変数はすべて新しいシェルにエクスポートされているはずです。

シェルが読み込むかどうかを知る方法~/.profileargv[0]、別名の最初の文字がであるかどうかをチェックすること$0でした'-'

から始まるcshエイリアスが導入されました。エイリアスは環境にエクスポートされませんでした。csh2つの異なる初期化スクリプトを読み込むように設計されました。~/.loginユーザーがログインしたときにのみ読み取られ、これを行うキューはでargv[0]始まった場合'-'でした。~/.cshrcシェルが開始されるたびに読み取られました。一般に、エイリアスをに~/.cshrc、その他すべてをに配置しました~/.logincshまた~/.logout、ほとんどの場合、画面をクリアして実行しましたfortune

他のシェルはこれらの同じ機能を採用しました。ksh読んでいました~/.kshrcbashで読んでいました~/.bashrc、そして、あなたの別名定義を配置したい場所をものでした。

したがって、長い話を短くするために、シェルを生成するアプリケーションは、それが「ログインシェル」である必要があるかどうかを判断し'-'ます。ほとんどの場合、対話型になるシェルはログインシェルとして起動され、シェルは引数として、またはスクリプトからいくつかのコマンドを実行することを意図しており、exitは通常のシェルです。

ただし、シェルを起動するのはアプリケーションの気まぐれ次第です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.