ログインシェルと非ログインシェルとは何ですか?


78

非ログインシェルの設定は.bashrcファイルに入り、ログインシェルの設定はファイルに入ると言われてい.profileます。

ログインシェルと非ログインシェルが本当に意味するものは何ですか?

技術用語をできるだけ使用せずに説明してください。

回答:


83

簡単に言えば:

  • シェルまたはターミナルを開いて(または1つに切り替えて)プロンプトを表示する前にログイン(ユーザー名?パスワード?)を要求する場合、それはログインシェルです。
  • gnome-terminalのように)使用せず、すぐに使用できる場合は、非ログインシェルです。

あなたがUbuntu Desktopの通常のユーザーである場合、唯一のログインシェルは...デスクトップです(ログインするにはパスワードを入力します;)?まあ、技術的にはGUIを起動するのはログインシェルですが、専門用語を使用しています。そして、はい、それは設定を読み込みます.profile

あなた(通常のユーザー)がログインシェルのように見えるログインシェルを表示するのは、デスクトップに問題があり、Ctrl+ Alt+ F1ショートカットで仮想端末に切り替える場合だけです。


ログインシェルを使用する他の一般的なケースは次のとおりです。

  • を介してリモートでコンピューターにアクセスするssh(またはローカルでに接続するssh localhost
  • bash -l(またはsh -l)を使用して初期ログインシェルをシミュレートする
  • で初期rootログインシェルをシミュレートするsudo -i
    • または別の非ユーザー用sudo -u username -iroot
  • 別の非として認証するrootと、ユーザー(とそのパスワード)su - username
  • sudo loginコマンドを使用してユーザーを切り替える

ターミナルからEclipse IDEを起動すると、期待どおりに開きますが、Eclipseアイコンをクリックして開くと、Javaの場所を認識できません(そうでない場合、JavaのPATHが.profileファイルに設定されています)。つまり、Eclipseアイコンをクリックするにはログインシェルが必要です。なぜですか?
デューク

2
@DUKE、いいえ。デスクトップ/ GUIを使用する場合と、コマンドラインのみの真のコンソールシステムを使用する場合は、環境変数を別々に設定する必要があることを意味します。PATHなどを~/.pam_environment(変数のみ、bashコマンドなし)に入れ、ログアウト、ログインし、すべてがデスクトップとgnome-terminalに魔法のように表示されるのを見てください!
ISH

1
sshを介したログインは、ログインシェルを呼び出しません。ロードされない/etc/profile/etc/profile.dまたは~/.profile
xuhdev 14

この質問をご覧ください。
xuhdev 14

@xuhdev ssh経由のログインはログインシェルを呼び出し、/ etc / profile、/ etc / profile.d、および〜/ .bash_profileをロードします。
MichaelZ

9

「専門用語」がなければ正しい答えが得られるとは思いません。この質問は、「ログインシェルとは何か」というクエリに対してGoogleで最初に表示される質問なので、以下のより正確な答えを提供します。

ログインシェルは、単にログインシェルであると言われたシェルです。ログイン後にポップアップするシェルを意味するものではありませが、通常、ログインするアプリケーションはシェルにログインシェルとして起動するように指示します。ログインする必要があることをシェルに伝えるには、次の方法があります。

  1. -lまたは--loginそれを知っていると仮定してシェルを実行します(知らないシェルは知りませんが-l--loginいくつかのシェルでのみサポートされています)。
  2. argv[0]設定してシェルを実行します-{some_string}(つまり、通常argv[0]または他の文字列の前にHYPHEN-MINUSを追加します)。これはsshとsuが行うことです:suは単に-suasで実行可能ファイルを実行しargv[0]argv[0]現在実行中の実行可能ファイル名と関係があると考えているすべての人にこんにちは)、-zshユーザーが/bin/zshシェルとして設定したときにsshがzshを実行します。

シェルのLoginessは、パスワードを尋ねたり、他の認証手順を実行したりすることとはまったく関係ありません。sshやlogin(またはurxvtなどのターミナルエミュレーター)のようないくつかのプログラムargv[0]は、HYPHEN-MINUSで始まるログインシェルとしてシェルを実行します。suやsudo(またはzsh:の-セクションPRECOMMAND MODIFIERSで説明されているプリコマンド修飾子を参照man zshmisc)のようなものは、デフォルトではこれを行いませんが、そうすることができます。引数を使用してシェルにログインシェルを指定する唯一のオプション(シェルなど)がありますbash -l:コマンド引数付きのssh(リモートエンドで実行するものをsshに明示的に指定)。

一般に、最初にシェルを起動するために使用されるプログラムのドキュメントを参照して、シェルがログイン1であるかどうかを確認し、次にアプリがログインシェルを起動するかどうかを確認するテストを実行することをお勧めします(例:に追加echoする.profile)。


2番目のオプションに興味があります。bashを呼び出す前(または後に)argv [0]を実際に変更するにはどうすればよいですか。コマンドラインから実行できますか?
VeryHardCoder

@VeryHardCoderこれは、コマンドの実行に使用するアプリケーションによって異なります。Cコードでは、自然で避けられない関数のargv[0]1つに直接供給することで行われます。コマンドの実行と異なることを望まない場合でも、関数を使用するときは、実際に実行するコマンドの両方とパスを常に提供します。他の言語は独自の方法を提供します。具体的にbashが使用することができますが、これは、もちろん、あなたは何でシェルを実行している現在、置き換えられます編なので、あなたはサブシェル(使用する必要があります)exec* argv[0]exec*argv[0]exec -a new_argv0 bashexec(exec -a -zsh zsh)
ZYX

はい、わかった!実際には、もっと簡単な方法でも実行できます:(exec -l bash)
...-VeryHardCoder

1
2つの機能の違いは何ですか?これは単にブール値フラグですか?
アレクセイ

@Alexey主な機能の違いは、起動時に使用される構成ファイルのセットです。$0、また、おそらく他の何か(変数、設定など)が設定されて、シェルのログが構成ファイルで検出される可能性がありますが、実際にこれを検出して違いを生むのは誰ですか?私が知っているのはそれで全てです。
ZyX
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.