リモートシェルに接続していますが、矢印やエスケープキーなど、多くのキーが正しく機能していません。この答え 矢印キー、タブ補完が機能しない 間違ったシェルにいる可能性があることを示唆したので、 現在作業中のシェルを確認する方法? を参照しました。説明した方法を使用すると、奇妙な結果が得られます。
echo $Shell
/bin/bash
しかし
echo $0
sh
どのシェルを使用していますか?
疑わしい場合は、/proc
ファイルシステムを使用してください。各プロセスごとにフォルダーがあり、comm
ファイルには、そのプロセスのコマンドが記述されています。したがって、シェルのPIDを知ることで、シェルとは何かを知ることができます。
$ echo $$
4824
$ cat /proc/4824/comm
mksh
$ bash
xieerqi@eagle:~$ echo $$
6197
xieerqi@eagle:~$ cat /proc/6197/comm
bash
同じ情報を抽出するために参照できる他のファイルもあります。
これは 古いカーネル または/proc
ファイルシステム(Mac OS Xなど)をサポートしていないシステムでは機能しない可能性があります。
ps
コマンドには、pidを指定できる-p
フラグがあります。 $$
変数を参照するという同じ考えをまだ使用しています。
$ ps -p $$
PID TTY TIME CMD
7728 pts/5 00:00:00 mksh
$ bash
xieerqi@eagle:~$ ps -p $$
PID TTY TIME CMD
7776 pts/5 00:00:00 bash
$0
vs $Shell
。Arch Wiki によると、
シェルには、ユーザーの 優先シェル へのパスが含まれます。 Bashは起動時にこの変数を設定しますが、これは必ずしも現在実行中のシェルではないことに注意してください。
つまり、これはユーザーのデフォルトの対話型シェルであり、/etc/passwd
で設定されているものと同じです。これは、 $ Shell変数がサブシェルに対して変化しない の理由でもあります。たとえば、いくつのシェルを生成しても、$Shell
変数は変更されません。
$ echo $Shell
/bin/mksh
$ bash --posix
bash-4.3$ echo $Shell
/bin/mksh
bash-4.3$ dash
$ echo $Shell
/bin/mksh
$0
引数は、「self」-プログラムまたはファイル名を指定するコマンドを表示します。したがって、次のような単純なスクリプト:
#!/bin/bash
echo $0
次のような出力が得られます。
$ ./test_script.sh
./test_script.sh
これは、次のような操作を行ったときにも明らかです。
$ echo 'one two three' | xargs bash -c 'echo $0'
one
すべてのシェルで、-c
オプションは最初のコマンドライン引数を$0
変数に配置します。
インタラクティブシェルに関する限り、通常は0ドルで十分ですが、ご覧のとおり、使用しているシェルを知るための信頼できる方法ではありません。プロセスを知ることがはるかに信頼できる
sh
を使用しています。 $Shell
は現在使用されているログインシェルではなく、ログインシェルを参照するためです。
提供されている StackOverflow question link には、現在実行中のシェルを正しく判断するための正しいメソッドがあります。
リモートOSがUbuntu(または別のGNU/Linuxベースのディストリビューション)の場合、実行しているシェルを把握する非常に簡単な方法は、次のコマンドを実行することです。
ls -l /proc/$$/exe
リモートOSがnot Ubuntuまたは少なくとも同様のGNU/Linuxディストリビューションの場合、間違ったサイトで尋ねました。
何らかの理由でリモートOSに/proc
が欠落している場合(例えば、Ubuntuの機能が低下した、不完全な、またはアンティークのバージョン、またはコンテナ化されたOSインスタンスを実行している場合)、上記のコマンドは機能しません。
$0
を見ると、100%信頼できないという手がかりが得られます。すべてのプログラムは、その名前を別のものに偽造できます。いずれの場合でも、sh
(実際のBourne Shell)をLinuxにインストールすることはほとんどないので、実際に実行することはほとんどありません。sh
クローン、おそらくdash
。
現在shを使用しているようです。 bashに切り替えるには、「bash」と入力するだけです。
すでに多くのすばらしい答えが与えられていますが、echo $BASH_VERSION
を発行することもできます。これによりバージョン番号が出力される場合は、bashになっています。空の行が出力される場合、他のシェルの内部にいます。