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


Bourne shell(sh)
C shell(csh)
TC shell( tcsh)
Korn shell(ksh)
Bourne Again shell(bash)

问题:


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


评论

如何确定我正在使用的当前Shell?在stackoverflow.com

@KasiyA这也与askubuntu.com/questions/87853 / ...有关。

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

#1 楼

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

echo 
-bash


如果使用bash,结果将类似于以下内容( Bourne Again Shell)端子:

q4312078q

评论


0是环境变量吗?

– Mi_Onim
16-2-22在17:21

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

– Kingmilo
16年6月26日在4:49

注意:这不适用于交互式csh。 %echo $ 0没有文件$ 0。 ,但确实适用于tcsh

– Sergiy Kolodyazhnyy
16 Sep 18'在12:43

如果一个是符号链接,则不起作用。像bash一样bash

–安瓦尔
16 Dec 6'在17:43

@Anwar很好,在从echo $ 0获得shell名称后,通过ls -l`哪个`查看它是否与另一个shell二进制文件符号链接。

– JivanAmara
17-2-10在23:38



#2 楼

要查找默认环境下的外壳程序,可以检查环境变量SHELL的值:

echo $SHELL


要查找当前的外壳程序实例,请查找以下进程( shell)具有当前shell实例的PID。

要查找shell当前实例的PID:

echo "$$"


现在查找具有PID的过程:

ps -p <PID>


将其放在一起:

ps -p "$$"


评论


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

– Kingmilo
15年2月28日在4:13

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

–heemayl
15年2月28日在4:24

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

– 18446744073709551615
17-10-30在10:32

要以一种可在gnu和bsd ps版本之间移植的方式仅捕获当前shell的shell名称,这很好用:ps -cp“ $$” -o command =“”

–詹姆斯·托马西诺(James Tomasino)
1月7日22:37

谢谢@詹姆斯·托马西诺(James Tomasino)表现最好!

–罗伯特·霍顿
2月6日下午1:26

#3 楼

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

所以我的
$SHELL在iTerm2上给了我/bin/bash
$SHELL在iTerm2上给了我/bin/bash。 br /> q4312079q,q4312079q在终端上给我q4312079q

评论


这是其他最受好评的答案的很好的歧义。谢谢。

–迈克尔·霍夫曼(Michael Hoffmann)
18年2月14日在18:58

对我来说,我已经安装了zsh,这是当前的默认设置,要更改为bash,我要做的就是在终端中键入bash。要切换回zsh,请键入zsh

–Yousuf Azad
19-2-27在11:11

#4 楼

其他答案倾向于使用特定于shell的功能,但是我们试图发现我们使用的是哪个shell,因此它们假定了问题的答案。例如,所有答案都不对鱼有用。 PID。使用PPID查找cmd。

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


感谢改进@muru

评论


您可以使用ppid = / cmd =省略标题(因此尾号为-1s),并考虑查看/proc/.../exe以查看正在运行的文件(因为可以通过任何方式操纵cmd输出运行外壳)。

–muru
18-4-6在4:07



显然,由于不符合posix,这在busybox中不起作用:ref:github.com/broadinstitute/cromwell/pull/…

–埃文·本恩
18年4月30日在5:04

您的第一个代码块代表什么?

–安德烈亚斯(Andreas)
2月11日在22:29

该解决方案解决了假设外壳的问题,但是引入了假设操作系统的问题。 macOS(以及可能的其他BSD Distros)附带的readlink的BSD版本使用-f来指定“格式”,这是一个printf样式字符串,必须以%开头和结尾,并具有各种模板选项。

– Masukomi
5月21日15:02

#5 楼

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

 echo "$SHELL"
 


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

 /bin/bash
 


如果没有更改任何配置,应该将其设置为Bash,因为Bash是Ubuntu上的默认Shell。

评论


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

– Kingmilo
15年2月28日在4:07

@kingmilo我的答案中没有/ bin / sh参考

–kos
15年2月28日在4:12

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

– Kingmilo
2015年2月28日在4:14



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

–kos
2015年2月28日在4:49

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

– terdon
16年8月18日在9:02

#6 楼

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



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

cat /etc/shells


例如,在默认安装的Ubuntu 18.10上,它给出:

# /etc/shells: valid login shells
/bin/sh
/bin/dash 
/bin/bash
/bin/rbash


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

现在出现问题“如何操作”。我可以从帐户中更改使用的外壳吗?”假设这意味着“如何永久更改终端将使用的默认外壳”,那么这里就有一个答案。


#7 楼

在我连接的其中一台服务器中,登录外壳是/bin/sh,这是指向/bin/bash的符号链接

这里的大多数答案都将给出sh,这将使OP认为它是Bourne外壳而不是GNU bash,除了给出/bin/bash的那个

适用于这种情况的另一个选择是:

$ echo $SHELL
/bin/sh

$ ls -l /bin/sh
lrwxrwxrwx 1 root root 4 May 31 16:15 /bin/sh -> bash

$ /bin/sh --help
GNU bash, version 4.2.10(1)
Usage:  /bin/sh [GNU long option] [option] ...
        /bin/sh [GNU long option] [option] script-file ...