Bourne shell(sh)
C shell(csh)
TC shell( tcsh)
Korn shell(ksh)
Bourne Again shell(bash)
问题:
当我打开终端窗口时,默认情况下打开哪个外壳?
如何检查安装了多少个外壳?
如何更改帐户中使用的外壳?
#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`哪个
– 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 ...
评论
如何确定我正在使用的当前Shell?在stackoverflow.com上
@KasiyA这也与askubuntu.com/questions/87853 / ...有关。
请注意,终端是shell的接口(在过去它实际上是物理接口),而shell不是终端-它是一个命令解释器。另请参见askubuntu.com/a/640105/295286