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

use*_*837 96 shell

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

gee*_*aur 95

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

  1. ps -p$$ -ocmd=. (在 Solaris 上,这可能需要ps -p$$ -ofname=,在 macOS 和 BSD 上应该是ps -p$$ -ocommand=。)
  2. 检查$BASH_VERSION$ZSH_VERSION以及其他shell特定的变量。
  3. 检查$SHELL; 这是最后的手段,因为它指定了您的默认shell 而不一定是当前shell。

  • 你也应该提到`$0`吗? (6认同)
  • 在 Mac 上,#1 是 `ps -p $$ -o comm=""`。另外,对于那些想知道的人来说,$$ 是 [shell 进程 ID](http://stackoverflow.com/questions/78493/what-does-mean-in-the-shell)。 (4认同)
  • 如果你正在运行 `tcsh`,`$tcsh` 和 `$version` 将被设置。这些是 shell 变量,而不是环境变量。如果您运行的是非 tcsh 版本的 `csh`,我认为没有任何独特的变量。当然,一方面用于检查变量的语法在 csh/tcsh 和 sh/ksh/bash/zsh 之间有所不同。 (2认同)

Ste*_*n D 55

我发现在我的系统上安装的四个 shell(bash、dash、zsh、csh)中,以下内容有效:

$ ps -p $$
Run Code Online (Sandbox Code Playgroud)

以下内容适用于 zsh、bash 和 dash,但不适用于 csh:

$ echo $0
Run Code Online (Sandbox Code Playgroud)

  • 也不适用于鱼。 (2认同)

jll*_*gre 9

由于问题要求使用的 shell 并且没有讨论传递给它的潜在参数,因此这里有一种避免显示它们的方法:

$ ps -o comm= -p $$
ksh93 
Run Code Online (Sandbox Code Playgroud)


pal*_*wim 8

关于一些较轻的实现(Android 手机、busybox 等)的说明:ps并不总是支持-pswitch,但您可以使用类似ps | grep "^$$ ". (此grep正则表达式将唯一标识 PID,因此不会出现任何误报。)

  • `ps | grep $$` 仍然可以给出误报,例如,如果您当前的进程是 `1234` 并且有一个进程 `​​12345`。 (9认同)

小智 7

有两种非常简单的方法:

  • 使用ps命令:

    ps -o comm= $$
    
    Run Code Online (Sandbox Code Playgroud)

    或者

    ps -h -o comm -p $$
    
    Run Code Online (Sandbox Code Playgroud)

    在哪里:

    • -h或完成所有选项以=不显示任何标题。
    • -o comm仅显示进程基名(bash而不是/bin/bash)。
    • -p <PID> 仅列出提供了 PID 表单列表的进程。
  • 使用/proc进程信息伪文件系统:

    cat /proc/$$/comm
    
    Run Code Online (Sandbox Code Playgroud)

    此选项的行为与上述ps命令完全相同。

    或者

    readlink /proc/$$/exe
    
    Run Code Online (Sandbox Code Playgroud)

    /proc/PID/exe链接到正在执行的文件,在这种情况下将指向 /bin/bash、/bin/ksh 等。

    为了仅获取外壳的名称,您可以使用

    basename $(readlink /proc/$$/exe)
    
    Run Code Online (Sandbox Code Playgroud)

    即使您在脚本、源代码或终端中,作为指向正在使用的 shell 解释器二进制文件的链接,这是唯一始终给出相同结果的选项。

    警告您必须知道这将显示最终的二进制文件,因此 ksh 可能链接到 ksh93 或 sh 链接到 bash。

的用法/proc通过/proc/self链接到当前命令的 PID非常有用。

  • `basename $(readlink /proc/$$/exe)` 是 Korn/POSIX shell 语法。在 csh/tcsh/rc/es/akanga/fish 中不起作用。`$$` 在 `rc`/`es`/`akanga`/`fish` 中不起作用。 (2认同)