1. 概要

シェルは、オペレーティングシステムへのコマンドラインインターフェイスを提供するプログラムです。

LinuxおよびUnixライクなオペレーティングシステムは、ユーザーに異なるシェルを提供します。 Bash(Bourne Again Shell)、csh(C Shell)、ksh(Korn Shell)、およびsh(Bourne Shell)が最も一般的なものです。

このチュートリアルでは、現在作業しているシェルを見つけるためのさまざまな方法を見ていきます。

2. echoコマンドの使用

Linuxのechoコマンドは、引数として渡されるテキストまたは文字列の行を表示するために使用されます。 このコマンドを使用して、現在のシェルを印刷することもできます。

2.1. echo $ SHELL

$ SHELL 変数には、デフォルトのシェルの名前が含まれています。 その値を表示できます。

$ echo $SHELL
/bin/bash

このアプローチはほとんどの場合機能しますが、現在実行中のシェルがデフォルトのシェルではない可能性があるため、信頼できる方法ではありません。

2.2. エコー$0

$0変数でechoコマンドを使用することもできます。

$ echo $0
bash

このアプローチはコマンドラインではうまく機能しますが、スクリプト内からは機能しません。スクリプトファイル内では、 $0変数は現在のシェルを出力しません。 代わりに、ファイルまたはプログラムの名前を出力します。

3. psコマンドの使用

ps (プロセスステータス)コマンドは、現在実行中のプロセスのスナップショットを提供します。

$ ps
  PID TTY          TIME CMD
 4467 pts/0    00:00:00 bash
 5379 pts/0    00:00:00 ps

出力の最後の列CMDは、bashシェルが現在実行中であることを示しています。

4. / etc /passwdファイルの表示

/ etc / passwd ファイルは、ユーザー名、ユーザーID、グループID、ホームディレクトリ、シェルなどのユーザーのアカウント情報を含むLinuxのプレーンテキストファイルです。

grep コマンドを使用して、このファイルで、現在ログインしているユーザーのユーザー名で始まる文字列を検索できます。

$ grep "^$USER" /etc/passwd
vroot:x:1000:1000:Vroot:/home/vroot:/bin/bash

出力の最後の部分は、デフォルトのシェルがbashであることを示しています。 繰り返しますが、デフォルトのシェルが常に現在のシェルであるとは限らないため、これは信頼できるアプローチではありません。

5. lsofコマンドの使用

lsof コマンドは、実行中のすべてのプロセスの開いているすべてのファイルを一覧表示します。 -p オプションを指定してこのコマンドを使用すると、現在のシェルのプロセスIDに属するファイルのみを選択できます。

$ lsof -p $$
COMMAND  PID     USER   FD   TYPE DEVICE  SIZE/OFF    NODE NAME
bash    2796 vroot  cwd    DIR  253,2      4096 2097153 /home/vroot
bash    2796 vroot  rtd    DIR  253,0      4096       2 /
bash    2796 vroot  txt    REG  253,0   1514000 2490662 /usr/bin/bash
bash    2796 vroot  mem    REG  253,0   8406312  131168 /var/lib/sss/mc/passwd
............... other lines omitted ...................................
bash    2796 vroot  255u   CHR  136,0       0t0       3 /dev/pts/0

$$ は、現在のシェルのプロセスIDに展開される特別なパラメーターです。

出力の最初の列COMMANDは、実行中のシェルがbashであることを示しています。

6. readlinkコマンドの使用

readlink コマンドは、解決されたシンボリックリンクまたは正規ファイル名を出力します。 / proc / [pid] / exe は、プロセスID pidで実行されたコマンドの実際のパス名を含むシンボリックリンクです。

$$ 特殊パラメーターを使用して、現在のシェルのプロセスIDでreadlinkを実行できます。

$ readlink /proc/$$/exe
/usr/bin/bash

パス名からシェルコマンドまで、実行しているシェルはbashであると推測できます。

7. / proc / $$ /cmdlineを使用する

/ proc / [pid] / cmdline は、ID pidのプロセスの完全なコマンドラインを含む読み取り専用ファイルです。

$$特殊パラメーターをpidとして使用できます。

$ cat /proc/$$/cmdline
bash 

出力は、bashシェルを実行していることを示しています。

8. その他のアプローチ

時々、私たちが見たアプローチのどれもうまくいかないかもしれません。 これは、実行可能ファイルが実行中のシェルと一致しない場合に発生する可能性があります。

このような場合、いくつかのシェル固有の環境変数を調べて、どのシェルが実行されているかを推測できます。

たとえば、bashシェルの場合、 $BASH変数が設定されます。 同様に、tcshシェルでは、 $version変数が設定されます。

$PS1および$PS2 変数はshシェルで設定され、 $PS3および$PS4変数はkshシェル。

9. 結論

この記事では、現在Linuxで実行しているシェルを判別するさまざまな方法を学びました。 いくつかのアプローチの例と各アプローチの制限について見てきました。 また、一般的なアプローチが機能しない場合に使用できるヒューリスティックについても学びました。