1. ホーム
  2. スクリプト・コラム
  3. リナックスシェル

シェルの4つの実行モード(スタートアップモード)の実装

2022-02-07 07:10:24

シェルは、ユーザーとLinuxシステムの橋渡し役であり、私たちは皆、シェルを使ってLinuxシステムを管理しています。

私たちはシェルを直接使うか、ユーザー名とパスワードを入力してシェルを使うことができます。

シェルに一つずつコマンドを入力し、その出力を時間差で見ることができ、その間ずっとシェルと対話することができ、これをインタラクティブと呼びます。また、シェルスクリプトファイルを実行し、すべてのコマンドを一括して実行することができます。これは非対話型と呼ばれます。

まとめると、シェルを実行する方法は4つあります。

  • 対話型ログインシェル。
  • インタラクティブな非ログインシェル。
  • 非対話型ログインシェル。
  • 非インタラクティブな非ログインシェル。

シェルが対話型かどうかを判断する

シェルがインタラクティブであるかどうかを判断する簡単な方法は2つあります。

1) 変数 - の値を見る。その値にiの文字が含まれていれば、インタラクティブであることを意味する。

[例1】CentOSのGNOMEデスクトップ環境に付属するターミナルで、- の値を出力する。

[jb51.net]$ echo $-
himBH


には、インタラクティブを意味するiが入ります。

[例2】シェルスクリプトファイルの - の値を出力する。

[jb51.net]$ cat test.sh
#! /bin/bash

echo $-
[jb51.net]$ bash . /test.sh
hB



は i を含まず、非対話的です。シェルスクリプトは新しいプロセスで実行される必要があることに注意してください。

2) 変数PS1の値を確認します。空でなければ対話型、そうでなければ非対話型は変数をクリアしてしまうので非対話型です。

[例1】CentOSのGNOMEデスクトップ環境に付属するターミナルで、PS1の値を出力する。

[mozhiyan@localhost]$ echo $PS1
[\u@\h \W]\$


空でない、インタラクティブのため。

[例2】シェルスクリプトファイルのPS1の値を出力する。

[jb51.net]$ cat test.sh
#! /bin/bash

echo $PS1
[jb51.net]$ bash . /test.sh



空値、非インタラクティブの場合。シェルスクリプトは新しいプロセスで実行される必要があることに注意してください。

シェルがログインしているかどうかを判断する

シェルがログインしているかどうかの判断も非常に簡単で、shopt login_shell を実行するだけで、ログインしている場合は on、ログインしていない場合は off という値を設定することができます。

shoptコマンドは、シェルの使い勝手を向上させるための動作オプションを表示、設定するために使用します。

例1] CentOSのGNOMEデスクトップ環境に付属するターミナルでlogin_shellオプションを表示する。

[jb51.net]$ shopt login_shell
login_shell off



[例2】Ctrl+Alt+Fnで仮想端末に切り替え、ユーザー名とパスワードを入力してログインし、login_shellオプションを見ます。

[jb51.net]$ shopt login_shell
login_shell on

[例3】シェルスクリプトファイルの login_shel オプションを表示する。

[jb51.net]$ cat test.sh
#! /bin/bash

shopt login_shell
[jb51.net]$ bash . /test.sh
login_shell off



インタラクティブ、ログインの同時判定

インタラクティブと同時にログインしているかどうかを判断するには、次のコマンドを使用するだけです。

echo $PS1; shopt login_shell



または

echo $-; shopt login_shell



一般的なシェル起動方法

1) Linux コンソール (デスクトップ環境に付属するターミナルではない) や ssh (通常のログイン方法) からシェルにログインする場合、シェルへの対話型ログインとなります。

[jb51.net]$ echo $PS1;shopt login_shell
[\u@\h \W]\$
login_shell on



2) bashコマンドはデフォルトでは非ログインであり、-loginオプション(-lと略す)を付けることでログイン状態になる。

[jb51.net]$ cat test.sh
#! /bin/bash

echo $-; shopt login_shell
[jb51.net]$ bash -l . /test.sh
hB
login_shell on



3) ()で囲まれたグループコマンドやコマンド置換で子シェルに入ると、子シェルが親シェルの対話とログインのプロパティを継承します。このシードプロセスは、exceを実行せずに再度フォークすることによってのみ作成され、設定ファイルの再読み込みは行いません

[jb51.net]$ bash
[jb51.net]$ (echo $PS1;shopt login_shell)
[\u@\h \W]\$
login_shell off
[jb51.net]$ bash -l
[jb51.net]$ (echo $PS1;shopt login_shell)
[\u@\h \W]\$
login_shell on



4) sshはリモートコマンドを実行するが、非ログイン時は非インタラクティブ、非ログインである。

[jb51.net]$ ssh localhost 'echo $PS1;shopt login_shell'

login_shell off



5) Linuxデスクトップ環境でターミナルを開く際の、ログインを伴わない対話型シェル。

デスクトップ環境で、ターミナルを対話型の非ログインシェルとして開く

シェル(起動)の4つの方法については、今回で終了です。シェルに関する詳しい情報は、過去の記事を検索していただくか、引き続き以下の記事をご覧ください。