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

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

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


当前回答

在Mac OS X(和FreeBSD)上:

ps -p $$ -axco command | sed -n '$p' 

其他回答

在Mac OS X(和FreeBSD)上:

ps -p $$ -axco command | sed -n '$p' 

一种方法是:

ps -p $$ -o exe=

在我看来,这比在另一个答案中使用-o args或-o comm更好(这些可能会使用一些符号链接,例如当/bin/sh指向某个特定的shell,如Dash或Bash)。

上面返回的是可执行文件的路径,但要注意,由于/usr-merge,可能需要检查多个路径(例如/bin/bash和/usr/bin/bash)。

还要注意,上面的文件并不完全与POSIX兼容(POSIX ps没有exe)。

Ps是最可靠的方法。SHELL环境变量不能保证被设置,即使设置了,也很容易被欺骗。

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

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

没有临时变量shellPID,例如:

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

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

你可以试试:

ps | grep `echo $$` | awk '{ print $4 }'

Or:

echo $SHELL