使用しているシェルを確認するにはどうすればよいですか?


357

私は端末がシェルに他ならないことを読み、Unixはさまざまな種類のシェルを提供しています。

  • ボーンシェル(sh)
  • Cシェル(csh)
  • TCシェル(tcsh)
  • Kornシェル(ksh)
  • Bourne Againシェル(bash)

質問:

  • ターミナルウィンドウを開くと、デフォルトでどのシェルが開きますか?
  • インストールされているシェルの数を確認するにはどうすればよいですか?
  • アカウントから使用するシェルを変更するにはどうすればよいですか?



端末はシェル(ある時点では実際には物理的なインターフェイスであった)へのインターフェイスであり、シェルは端末ではないことに注意してください-これはコマンドインタープリタです。askubuntu.com/a/640105/295286
Sergiy Kolodyazhnyy

回答:


427

ターミナルで次のコマンドを入力して、使用しているシェルを確認できます。

echo $0

bashBourne Again Shell)ターミナルを使用している場合、結果は次のようになります。

-bash

2
ある0環境変数は?
Mi_Onim

43
@Mi_Onim $ 0は実行中のプロセスの名前です。シェル内で使用すると、シェルの名前が返されます。スクリプト内で使用する場合は、スクリプトの名前になります。
キングミロ

2
:これは対話型では機能しません csh% echo $0 No file for $0.が、それのために働くんtcsh
Sergiy Kolodyazhnyy

2
シンボリックリンクの場合は機能しません。のようbashsh
アンワー

9
あなたからのシェル名を取得した後@Anwarは、良い点を作るecho $0ls -l `which <name>` それが別のシェルバイナリにシンボリックリンクされているかどうかを確認します。
ジバンアマラ

121

デフォルト環境にあるシェルを見つけるには、SHELL環境変数の値を確認できます。

echo $SHELL

現在のシェルインスタンスを見つけるには、現在のシェルインスタンスのPIDを持つプロセス(シェル)を探します。

シェルの現在のインスタンスのPIDを見つけるには:

echo "$$"

次に、PIDを持つプロセスを見つけます。

ps -p <PID>

それを一緒に入れて:

ps -p "$$"

27
$ SHELLは、システム(またはユーザー)の既定のシェルです。これは通常(必ずしもそうではありませんが)任意の時点で実際に使用されているシェルです。
キングミロ

1
@kingmilo:そうですね、答えは修正されました。
heemayl

postgresのを設定するために、例えば、ジェンキンス、... - 「<ユーザー名>のsu」を介してユーザーに切り替えるとき、私はこれはかなり有用であることが判明
いじめっ子

1
echo $SHELL/bin/cshps -p $$与えてくれました22673 pts/1 00:00:00 bash。キングミロは、なぜ同じではないのか(上で)説明した。
18446744073709551615

@ 18446744073709551615同じだとも言っていません。答えをもう一度注意深く読んでください。デフォルトおよび現在の文言に注意してください。
-heemayl

25

$SHELLデフォルトのシェルを提供します。 $0現在のシェルを提供します。

たとえば、デフォルトのシェルとしてbashがあり、これをターミナルアプリに使用しています。しかし、私のiTerm2アプリでは、ウィンドウが開くときにコマンドを使用します/bin/ksh

だから私$0/bin/kshiTerm2で私に 与えます。 iTerm2 $SHELLを教え/bin/bashてくれます。 $0、ターミナルで$SHELL/bin/bashに与えます


2
これは、他のトップ投票の回答の明確な明確化です。ありがとうございました。
マイケルホフマン

私にとっては、zshがインストールされており、それがbashに変更するための現在のデフォルトですbash。ターミナルで入力するだけです。zshの、型に戻すためにzsh
Yousufアザド

8

ユーザーのデフォルトシェルを確認するには、次を実行します。

echo "$SHELL"

たとえば、Bashを使用している場合、次の出力が得られます。

/bin/bash

構成を変更しなかった場合、BashはUbuntuのデフォルトシェルであるため、Bashになります。


/ bin / shはシェルコマンド言語であり、Bourneシェルではありません。回答を編集してください。
キングミロ

@kingmilo /bin/sh私の答えに参照はありません
コス

@kolは編集前にありました。また、$ SHELLはシステム(またはユーザー)の既定のシェルであり、通常(必ずしもそうではありませんが)常に実際に使用されているシェルです。
キングミロ

1
@kingmiloもう一度答えを読んで、私はあなたの懸念が何であるかを理解していると思います。私の答えで「現在」の意味を明らかにしました
コス

1
@frederickjhの魚はここでは少し奇妙です。この$$変数は実際にはPOSIXによって定義されており、大部分のシェルで機能します。魚はここで標準に従わないことに決めたので、それを無視するのは公平だと思う。$$sh、dash、bash、zsh、ksh、ash、tcsh、cshで期待どおりに機能することを確認できます。実際、私の頭の上では、機能しない魚以外のシェルは考えられません。
テルドン

8

他の答えは、シェル固有の機能を使用する傾向がありますが、使用しているシェルを発見しようとしているため、問題に対する答えを想定しています。例えば、答えはどれも魚には機能しません。

sh -c 'ps -p $$ -o ppid=' | xargs ps -o comm= -p

代わりに、shの呼び出しで$$構文を使用しますが、PIDではなくPPIDを探しています。PPIDを使用して、cmdを見つけます。

sh -c 'ps -p $$ -o ppid=' | xargs -I'{}' readlink -f '/proc/{}/exe'

改善してくれてありがとう@muru


2
ppid=/ cmd=を使用してヘッダー(およびtail -1s)を省略し、/proc/.../exe実行中のファイルを確認することを検討します(cmdシェルを実行したもので出力を操作できるため)。
ムル

1
どうやらこれは、非POSIX準拠に、busyboxのでは動作しません:参照:github.com/broadinstitute/cromwell/pull/...
エヴァン・ベン

4

元の投稿は3つの質問をしました。与えられた答えは、「ターミナルウィンドウを開くと、デフォルトでどのシェルが開かれますか?」という最初の質問をカバーしています。また、「端末で現在実行されているシェルを確認するにはどうすればよいですか」という質問にも答えられません。しかし、私が見る限り、最初に尋ねられた2番目または3番目の質問、つまり「インストールされているシェルの数を確認するにはどうすればよいですか」に誰も答えていません。「アカウントから使用するシェルを変更するにはどうすればよいですか?」

  • 「インストールされているシェルの数を確認するにはどうすればよいですか?」次のコマンドは、使用可能なすべてのシェルをリストします。

猫/ etc / shells

たとえば、Ubuntu 18.10のデフォルトのインストールでは、次の結果が得られます。

#/ etc / shells:有効なログインシェル

/ bin / sh

/ bin / dash

/ bin / bash

/ bin / rbash

ただし、デフォルトではshはダッシュへのシンボリックリンクであり、rbashはオプション-r( "restricted bash")を使用してbashにリンクするため、実際には上記のリストが示す4つではなく2つのシェルしかありません。次のコマンドは、リストされたシェルのいずれかが実際にシンボリックリンクであるかどうか、およびリンクしている場合はリンク先を表示します。ls -l / bin

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.