如何确定我正在使用的当前shell ?

仅仅ps命令的输出就足够了吗?

如何在不同风格的Unix中实现这一点?


当前回答

我特别喜欢Nahuel Fouilleul的解决方案,但我不得不在Ubuntu 18.04 (Bionic Beaver)上使用内置的Bash shell运行它的以下变体:

bash -c 'shellPID=$$; ps -ocomm= -q $shellPID'

没有临时变量shellPID,例如:

bash -c 'ps -ocomm= -q $$'

只会输出ps。也许你们不是都在使用非交互模式,这是有区别的。

其他回答

你可以使用echo $SHELL|sed "s/\/bin\// g"

我特别喜欢Nahuel Fouilleul的解决方案,但我不得不在Ubuntu 18.04 (Bionic Beaver)上使用内置的Bash shell运行它的以下变体:

bash -c 'shellPID=$$; ps -ocomm= -q $shellPID'

没有临时变量shellPID,例如:

bash -c 'ps -ocomm= -q $$'

只会输出ps。也许你们不是都在使用非交互模式,这是有区别的。

使用$SHELL环境变量获取它。简单的sed可以删除路径:

echo $SHELL | sed -E 's/^.*\/([aA-zZ]+$)/\1/g'

输出:

bash

它在macOS、Ubuntu和CentOS上进行了测试。

$SHELL不需要总是显示当前SHELL。它只反映要调用的默认shell。

为了测试上面的测试,假设bash是默认shell,尝试echo $ shell,然后在同一终端,进入其他一些shell(例如KornShell (ksh))并尝试$ shell。在这两种情况下,您将看到结果为bash。

要获得当前shell的名称,使用cat /proc/$$/cmdline。和通过readlink /proc/$$/exe到shell可执行文件的路径。

echo $$ # Gives the Parent Process ID 
ps -ef | grep $$ | awk '{print $8}' # Use the PID to see what the process is.

你如何知道你当前的shell是什么?