web-dev-qa-db-ja.com

bashまたはshを使用していますか?

リモートシェルに接続していますが、矢印やエスケープキーなど、多くのキーが正しく機能していません。この答え 矢印キー、タブ補完が機能しない 間違ったシェルにいる可能性があることを示唆したので、 現在作業中のシェルを確認する方法? を参照しました。説明した方法を使用すると、奇妙な結果が得られます。

echo $Shell 
/bin/bash

しかし

echo $0
sh

どのシェルを使用していますか?

7
Info5ek

Procファイルシステムを使用して、シェルのプロセス名を知る

疑わしい場合は、/procファイルシステムを使用してください。各プロセスごとにフォルダーがあり、commファイルには、そのプロセスのコマンドが記述されています。したがって、シェルのPIDを知ることで、シェルとは何かを知ることができます。

$ echo $$
4824
$ cat /proc/4824/comm                                                          
mksh
$ bash
xieerqi@eagle:~$ echo $$
6197
xieerqi@eagle:~$ cat /proc/6197/comm
bash

同じ情報を抽出するために参照できる他のファイルもあります。

  • / proc/$$/stat
  • / proc/$$/status
  • / proc/$$/cmdline
  • / proc/$$/exe(実行可能ファイル自体へのシンボリックリンク)

これは 古いカーネル または/procファイルシステム(Mac OS Xなど)をサポートしていないシステムでは機能しない可能性があります。

Psコマンドを使用した同じアプローチのバリエーション

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ドルで十分ですが、ご覧のとおり、使用しているシェルを知るための信頼できる方法ではありません。プロセスを知ることがはるかに信頼できる

10

shを使用しています。 $Shellは現在使用されているログインシェルではなく、ログインシェルを参照するためです。

提供されている StackOverflow question link には、現在実行中のシェルを正しく判断するための正しいメソッドがあります。

10
Anwar

リモート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

4
jlliagre

現在shを使用しているようです。 bashに切り替えるには、「bash」と入力するだけです。

2
Edgy1

すでに多くのすばらしい答えが与えられていますが、echo $BASH_VERSIONを発行することもできます。これによりバージョン番号が出力される場合は、bashになっています。空の行が出力される場合、他のシェルの内部にいます。

1
Zoltan