これらの4つの用語を区別しようとしていますログイン、非ログイン、インタラクティブ、非インタラクティブ:
私が理解するように
インタラクティブ-非ログインシェル:システムを起動し、システムにログインしてターミナルを開き、
非対話型-ログインシェル:システムにTelnetでログインします
しかし、インタラクティブなログインシェルはどうでしょうか?
システムにログインし、仮想端末を開いてログインしますか?そして
非対話型-非ログインシェル、crontabで自動スクリプトを実行していますか?
あなたが持っているように見える唯一の本当の誤解は、非インタラクティブなログインシェルを構成するものについてです。
簡単に説明します(詳細については here を参照)。例を以下に示します。
対話型ログインシェル:たとえば、ssh
を介してリモートコンピューターにログインします。または、ローカルマシンのttyにドロップします(Ctrl+Alt+F1)そしてそこにログインします。
インタラクティブな非ログインシェル:新しいターミナルを開きます。
非対話型の非ログインシェル:スクリプトを実行します。すべてのスクリプトは独自のサブシェルで実行され、このシェルは対話型ではありません。スクリプトを実行するためだけに開き、スクリプトが終了するとすぐに閉じます。
非対話型ログインShell:これは非常にまれであり、遭遇する可能性は低いでしょう。起動する1つの方法はecho command | ssh server
です。 ssh
がコマンドなしで起動されると(リモートシェルでssh
を実行するssh command
の代わりにcommand
)、ログインシェルが起動します。 stdin
のssh
がttyでない場合、非対話型シェルを起動します。 echo command | ssh server
が非対話型ログインシェルを起動するのはこのためです。 bash -l -c command
で開始することもできます。
これを試してみたい場合は、次のようにさまざまな種類のシェルをテストできます。
このシェルはインタラクティブですか?
$-
変数の内容を確認します。対話型シェルの場合、i
が含まれます。
## Normal Shell, just running a command in a terminal: interacive
$ echo $-
himBHs
## Non interactive Shell
$ bash -c 'echo $-'
hBc
これはログインシェルですか?
移植性のない方法 がありますが、bashの場合は、login_Shell
オプションが設定されているかどうかを確認できます。
## Normal Shell, just running a command in a terminal: interacive
$ shopt login_Shell
login_Shell off
## Login Shell;
$ ssh localhost
$ shopt login_Shell
login_Shell on
これらすべてをまとめると、考えられる各タイプのシェルの1つです。
## Interactive, non-login Shell. Regular terminal
$ echo $-; shopt login_Shell
himBHs
login_Shell off
## Interactive login Shell
$ bash -l
$ echo $-; shopt login_Shell
himBHs
login_Shell on
## Non-interactive, non-login Shell
$ bash -c 'echo $-; shopt login_Shell'
hBc
login_Shell off
## Non-interactive login Shell
$ echo 'echo $-; shopt login_Shell' | ssh localhost
Pseudo-terminal will not be allocated because stdin is not a terminal.
hBs
login_Shell on
基本的に、シェルがログインしているかどうか、インタラクティブであるかどうかは、1つの理由だけで重要です。
同様に、シェルがログインしているかどうか、または対話型かどうかは、使用されるinvocation-正確なコマンド名とオプションのみに依存します。
それ以外の場合、2つのプロパティは直交します。シェルがログインしているかどうかは、シェルが対話型かどうかの判断に影響しません。
次のいずれかに該当する場合、Bashはログインシェルを開始します。
argv[0]
(起動されたコマンドの名前)は、-
で始まります-l
オプションが指定されている同様に、bashは、以下のいずれかに該当する場合、インタラクティブシェルを開始します。
bash some/file
ではなかった)または実行するコマンド文字列(bash -c 'foo'
)が指定されていません(実際の状態はもう少し複雑です。マニュアルを参照してください)-i
オプションが指定された特に(そして逆説的に)、後者はbash -ic 'foo'
がインタラクティブなシェルを開始することを意味します。
そのため、次のコマンドはログイン、インタラクティブシェルを開始しますが、それについてはインタラクティブではなく、呼び出しはログインとは関係ありませんでした。
bash -lic true
コンソールまたはGUIを介したログインがログインシェルを開始する(またはしない)ことは、適切な呼び出しを使用したログインプロセスの影響です。
条件と効果については、 bashマニュアル、スタートアップファイルのセクション で詳しく説明しています。
混乱の主な原因は、「ログイン」シェルには別の一般的な意味があることです。
ユーザーのログインシェルは、そのユーザーのpasswd
エントリ(/etc/passwd
、LDAP、またはその他のソースから取得される可能性があります)で定義されたシェルです。
login
プログラム、SSHなどは、このシェルをloginシェルとして開始します。これは、回答の残りの部分で意味があり、先頭に-
が付きます。通常、コマンド名に。特に混乱させたい場合は、次のように言うことができます。
一部のログインプロセスは、ログインシェルとしてユーザーのログインシェルを開始します。
開発者が便利だと思ったため、GUIログインは純粋にログインシェルを開始することに注意してください-LightDMはログイン時にスクリプトを実行しますが、明らかにインタラクティブではなく、確かにユーザーのログインシェルに依存しません(第二の意味で)。ただし、ログインシェルを開始するディスプレイマネージャーに依存しないでください。すべてがそうであるわけではありません。また、WaylandとGNOMEでは、ログインプロセスはシェルスクリプトをまったく使用しません。
ログインシェル:
セッションにログインしたときにユーザーIDで実行される最初のプロセス。ログインプロセスは、通常はシェル実行可能ファイルの名前である引数0を先頭に「-」文字を付けて渡すという規則で、ログインシェルとして動作するようシェルに指示します。
インタラクティブシェル:
Ttyのユーザー入力からコマンドを読み取ります。とりわけ、このようなシェルはアクティベーション時にスタートアップファイルを読み取り、プロンプトを表示し、デフォルトでジョブ制御を有効にします。ユーザーはシェルと対話できます。スクリプトを実行するシェルは、常に非対話型のシェルです。
簡単に言えば、インタラクティブシェルはユーザー入力を必要としますが、非インタラクティブシェルはスクリプトによって実行され、ユーザー入力を必要としません。