我读到终端不过是shell,而Unix提供了不同类型的shell:
- 伯恩贝壳(sh)
- C Shell(CSH)
- TC壳(TCSH)
- 角壳(ksh)
- Bourne Again壳(重击)
问题:
- 打开终端窗口时,默认情况下打开哪个外壳?
- 如何检查安装了多少个外壳?
- 如何更改我帐户中使用的外壳?
我读到终端不过是shell,而Unix提供了不同类型的shell:
Answers:
您可以在终端中键入以下命令,以查看正在使用的外壳程序:
echo $0
如果使用bash(Bourne Again Shell)终端,结果将类似于以下内容:
-bash
0
环境变量吗?
csh
。% echo $0 No file for $0.
,但确实适用于tcsh
bash
如sh
echo $0
,ls -l `which <name>`
看它是否被链接到另一个shell二进制文件。
要查找默认环境下的shell,可以检查SHELL
环境变量的值:
echo $SHELL
要查找当前的shell实例,请查找具有当前shell实例的PID的进程(shell)。
要查找当前shell实例的PID,请执行以下操作:
echo "$$"
现在查找具有PID的进程:
ps -p <PID>
把它放在一起:
ps -p "$$"
echo $SHELL
给我/bin/csh
,ps -p $$
给我22673 pts/1 00:00:00 bash
。金米尔(上面)解释了为什么它们不一样。
$SHELL
给您默认的外壳。
$0
给您当前的外壳。
例如:我将bash作为默认外壳程序,用于我的终端应用程序。但是对于我的iTerm2应用程序,我在窗口打开时使用命令:/bin/ksh
。
所以我
在iTerm2上$0
给了我/bin/ksh
。
在iTerm2上$SHELL
给我/bin/bash
。
$0
,在码头上$SHELL
给我/bin/bash
bash
在终端中键入所有内容。要切换回zsh,请输入zsh
要知道哪个是用户的默认外壳程序,可以运行:
echo "$SHELL"
例如,如果您使用的是Bash,则应获得以下输出:
/bin/bash
如果您不更改任何配置,则应为Bash,因为Bash是Ubuntu上的默认Shell。
/bin/sh
在我的答案参考
$$
变量实际上是由POSIX定义的,并且可以在绝大多数shell上使用。Fish决定不遵循这里的标准,因此我认为可以忽略它。我可以确认$$
在sh,破折号,bash,zsh,ksh,ash,tcsh和csh中可以正常工作。实际上,除了我无法想象的鱼以外,我想不出其他任何贝壳。
其他答案通常使用特定于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
ppid=
/ cmd=
省略标题(以及tail -1
s),并考虑查看/proc/.../exe
正在运行的文件(因为cmd
可以通过运行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