如何检查正在使用的外壳?


354

我读到终端不过是shell,而Unix提供了不同类型的shell:

  • 伯恩贝壳(sh)
  • C Shell(CSH)
  • TC壳(TCSH)
  • 角壳(ksh)
  • Bourne Again壳(重击)

问题:

  • 打开终端窗口时,默认情况下打开哪个外壳?
  • 如何检查安装了多少个外壳?
  • 如何更改我帐户中使用的外壳?



请注意,终端是shell的接口(在过去它实际上是物理接口),而shell不是终端-它是命令解释器。另请参见askubuntu.com/a/640105/295286
Sergiy Kolodyazhnyy

Answers:


425

您可以在终端中键入以下命令,以查看正在使用的外壳程序:

echo $0

如果使用bashBourne Again Shell)终端,结果将类似于以下内容:

-bash

2
0环境变量吗?
Mi_Onim '16

43
@Mi_Onim $ 0是正在运行的进程的名称。如果在外壳内部使用它,则它将返回外壳的名称。如果在脚本内部使用它,它将是脚本的名称。
kingmilo

2
注意:这不适用于交互式 csh% echo $0 No file for $0.,但确实适用于tcsh
Sergiy Kolodyazhnyy

2
如果一个是符号链接,则不起作用。像bashsh
安瓦尔

9
@Anwar使得一个好点,你从壳名后echo $0ls -l `which <name>` 看它是否被链接到另一个shell二进制文件。
JivanAmara

121

要查找默认环境下的shell,可以检查SHELL环境变量的值:

echo $SHELL

要查找当前的shell实例,请查找具有当前shell实例的PID的进程(shell)。

要查找当前shell实例的PID,请执行以下操作:

echo "$$"

现在查找具有PID的进程:

ps -p <PID>

把它放在一起:

ps -p "$$"

27
$ SHELL是系统(或用户)的默认外壳程序,通常(但不一定)是在任何给定时刻实际使用的外壳程序。
kingmilo

@kingmilo:对,您的答案已修改。
heemayl

我切换到通过用户时发现这个非常有用的“ス- <用户名>”,例如用于建立postgres的,詹金斯,...

1
echo $SHELL给我/bin/cshps -p $$给我22673 pts/1 00:00:00 bash。金米尔(上面)解释了为什么它们不一样。
18446744073709551615

@ 18446744073709551615我也没有说过他们是相同的。请再次仔细阅读答案;请注意默认当前措辞。
heemayl

25

$SHELL给您默认的外壳。 $0给您当前的外壳。

例如:我将bash作为默认外壳程序,用于我的终端应用程序。但是对于我的iTerm2应用程序,我在窗口打开时使用命令:/bin/ksh

所以我 在iTerm2上$0给了我/bin/ksh。 在iTerm2上$SHELL给我/bin/bash$0,在码头上$SHELL给我/bin/bash


2
这是其他最受好评的答案的很好的歧义。谢谢。
Michael Hoffmann '18

对我来说,我已经安装了zsh,这是当前的默认设置,要更改为bash,我需要bash在终端中键入所有内容。要切换回zsh,请输入zsh
Yousuf Azad

8

要知道哪个是用户的默认外壳程序,可以运行:

echo "$SHELL"

例如,如果您使用的是Bash,则应获得以下输出:

/bin/bash

如果您不更改任何配置,则应为Bash,因为Bash是Ubuntu上的默认Shell。


/ bin / sh是Shell命令语言,而不是Bourne Shell,请编辑您的答案。
kingmilo

@kingmilo有没有/bin/sh在我的答案参考
科斯

@kol在编辑之前。还请注意,$ SHELL是系统(或用户)的默认外壳程序,通常(但不一定)是在任何给定时刻实际使用的外壳程序。
kingmilo

1
@kingmilo再次阅读答案,我想我理解您的担心,也许我表示不好。我在回答中阐明了“当前”的含义
kos 2015年

1
@frederickjh fish在这里有点奇怪。该$$变量实际上是由POSIX定义的,并且可以在绝大多数shell上使用。Fish决定不遵循这里的标准,因此我认为可以忽略它。我可以确认$$在sh,破折号,bash,zsh,ksh,ash,tcsh和csh中可以正常工作。实际上,除了我无法想象的鱼以外,我想不出其他任何贝壳。
terdon

8

其他答案通常使用特定于Shell的功能,但是我们试图发现我们使用的是哪个Shell,因此它们假定了问题的答案。例如,所有答案都不对鱼有效。

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

取而代之的是在sh的调用中使用$$语法,但是随后我们正在寻找PPID而不是PID。使用PPID查找cmd。

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

感谢您的改进@muru


2
您可以使用ppid=/ cmd=省略标题(以及tail -1s),并考虑查看/proc/.../exe正在运行的文件(因为cmd可以通过运行shell的任何东西来操纵输出)。
muru

1
:显然,这不busybox的工作中,由于不符合POSIX:REF github.com/broadinstitute/cromwell/pull/...
埃文·本

4

原始帖子问了三个问题。给出的答案确实涵盖了第一个问题:“当我打开终端窗口时,默认情况下打开哪个外壳?” 他们还回答了一个未被问到的问题,即“如何找出终端中当前正在运行哪个shell?”。但是,据我所知,没有人回答最初提出的第二个或第三个问题,即“如何检查安装了多少个外壳?” 和“如何从我的帐户更改使用的外壳?”

  • 回答“如何检查安装了多少个外壳?” 以下命令将列出所有可用的shell:

猫/ etc / shells

例如,在默认安装的Ubuntu 18.10上,这提供了:

#/ etc / shells:有效的登录shell

/ bin / sh

/ bin /破折号

/ bin / bash

/ bin / rbash

但是,默认情况下,sh是到破折号的符号链接,而rbash是通过选项-r(“受限bash”)链接到bash的符号,因此实际上只有两个shell,而不是上面列表中所示的四个shell。以下命令将向您显示列出的外壳是否实际上是符号链接,如果是,它们链接到的位置:ls -l / bin

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.