gee*_*aur 95
几种方法,从最可靠到最不可靠(以及从最到最不“重”):
ps -p$$ -ocmd=. (在 Solaris 上,这可能需要ps -p$$ -ofname=,在 macOS 和 BSD 上应该是ps -p$$ -ocommand=。)$BASH_VERSION,$ZSH_VERSION以及其他shell特定的变量。$SHELL; 这是最后的手段,因为它指定了您的默认shell 而不一定是当前shell。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)
由于问题要求使用的 shell 并且没有讨论传递给它的潜在参数,因此这里有一种避免显示它们的方法:
$ ps -o comm= -p $$
ksh93
Run Code Online (Sandbox Code Playgroud)
关于一些较轻的实现(Android 手机、busybox 等)的说明:ps并不总是支持-pswitch,但您可以使用类似ps | grep "^$$ ". (此grep正则表达式将唯一标识 PID,因此不会出现任何误报。)
小智 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非常有用。