私は対話型シェル、非対話型シェル、ログイン シェル、非ログイン シェルについて読み続けています。
(これは、どの .bash* ファイルが読み取られるかというコンテキストです)。
それぞれのシェルの種類が何なのか分からないので、まずは基本から始めましょう。
Mac から Ubuntu マシンに SSH 接続すると、どのようなタイプのシェルが起動されますか?
答え1
Ubuntu ボックスに SSH で接続すると、対話型ログイン シェルが利用できるようになります。違いは次のとおりです。
インタラクティブ vs. 非インタラクティブ:プロンプトで入力できるシェルはすべて対話型です。実際、多くのスクリプトは
$PS1
プロンプト文字列を保持する変数をテストして、対話型かどうかを判断します。シェルがシェル スクリプトを実行している場合、それは非対話型です。したがって、 を実行すると
ssh yourbox.example.com
、デフォルト設定を前提として対話型シェルが取得されますが、 を実行するとssh yourbox.example.com mighty_shellscript.sh
、非対話型シェルになり、スクリプトが終了すると SSH セッションが終了します。ログインと非ログイン:コンソールまたはリモート (SSH など) からログインする場合、または
-l
にオプションを渡す場合はbash
、ログイン シェルが取得されます。それ以外の場合 (ターミナル ウィンドウを開いた場合など) は、非ログイン シェルが取得されます。シェルがログイン シェルであるかどうかをテストするには、そのコマンド名が
-bash
ではなく であるかどうかを確認しますbash
。ps -ef | grep [b]ash
答え2
対話型のログイン シェルが提供されます。ただし、当然のことと思わず、自分で確認してください。
これは、ログイン シェルがあることを示しています ( からman bash
):
# shopt | grep login
login_shell on
これは対話型シェルがあることを示しています。i
(from man bash
) を探します:
# echo $-
himBH
取得した対話型ログイン シェルは、 、/etc/profile
および のいずれかを読み取り、で説明されているように、~/.bash_profile
~/.bash_login
~/.profile
man bash
bashが 対話型ログインシェル、または--loginオプション付きの非対話型シェルとして、/etc/profile ファイルが存在する場合は、まずそのファイルからコマンドを読み取って実行します。そのファイルを読み取った後、~/.bash_profile、~/.bash_login、~/.profile をこの順序で探し、最初に存在し読み取り可能なファイルからコマンドを読み取って実行します。 この動作を抑制するには、シェルの起動時に --noprofile オプションを使用できます。
答え3
のssh(1)manページにはこう書いてある。
もし指示が指定されている場合は、ログインシェルの代わりにリモートホスト上で実行されます。
そして
ユーザーの ID がサーバーによって受け入れられると、サーバーは指定されたコマンドを実行するか、マシンにログインしてユーザーにリモート マシン上の通常のシェルを提供します。
これらは、取得するシェルがログイン シェルであることを示唆しています。
答え4
このコマンドを試してください。
[max@localhost ~]$ エコー $SHELL バイナリ
この変数にシェルタイプが格納されているため、この出力が表示されますSHELL
。
環境変数を確認するには、このコマンドを入力してください
[max@localhost ~]$ 環境 。 。 。 ホスト名=localhost.localdomain シェル=/bin/bash ヒストサイズ=1000 ユーザー=最大 。 。 。
入力中にecho $SHELL
ここに保存されている値が表示されます
この値は起動ごとに更新されます