如何测试我在终端中使用的 shell?

如何测试我在终端中使用的 shell?

如何检查我在终端中使用的 shell?我在 MacOS 中使用的 shell 是什么?

答案1

有几种方法,从最可靠到最不可靠(以及从最到最不“重”):

  1. ps -p$$ -ocmd=。 (在 Solaris 上,这可能需要是ps -p$$ -ofname=,在 macOS 和 BSD 上应该是ps -p$$ -ocommand=。)
  2. 检查$BASH_VERSION$ZSH_VERSION和其他特定于 shell 的变量。
  3. 查看$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

相关内容