如何检查我在终端中使用的 shell?我在 MacOS 中使用的 shell 是什么?
答案1
有几种方法,从最可靠到最不可靠(以及从最到最不“重”):
ps -p$$ -ocmd=
。 (在 Solaris 上,这可能需要是ps -p$$ -ofname=
,在 macOS 和 BSD 上应该是ps -p$$ -ocommand=
。)- 检查
$BASH_VERSION
、$ZSH_VERSION
和其他特定于 shell 的变量。 - 查看
$SHELL
;这是最后的手段,因为它指定了您的默认shell 不一定是当前的壳。
答案2
我发现在我的系统上安装的四个 shell(bash、dash、zsh、csh)中可以执行以下操作:
$ ps -p $$
以下内容适用于 zsh、bash 和 dash,但不适用于 csh:
$ echo $0
答案3
由于问题询问所使用的 shell,并且没有讨论传递给它的潜在参数,因此有一种避免显示它们的方法:
$ ps -o comm= -p $$
ksh93
答案4
有两种非常简单的方法:
使用附注命令:
ps -o comm= $$
或者
ps -h -o comm -p $$
在哪里:
-h
或完成所有选项以=
不显示任何标题。-o comm
仅显示进程基本名称(bash
而不是/bin/bash
)。-p <PID>
仅列出提供 PID 表格列表的进程。
使用/进程伪文件系统的进程信息:
cat /proc/$$/comm
该选项的行为与上面的命令完全相同
ps
。或者
readlink /proc/$$/exe
这
/proc/PID/exe
链接到正在执行的文件,在本例中将指向 /bin/bash、/bin/ksh 等。为了仅获取外壳的名称,您可以使用
basename $(readlink /proc/$$/exe)
即使您在脚本、源代码或终端中,这是唯一始终给出相同结果的选项,作为指向正在使用的 shell 解释器的二进制文件的链接。
警告您必须注意,这将显示最终的二进制文件,因此 ksh 可能链接到 ksh93 或 sh 链接到 bash。
通过链接到当前命令的 PID的用法/proc
非常有用。/proc/self