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

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

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


当前回答

我对打印父进程的变体:

ps -p $$ | awk '$1 == PP {print $4}' PP=$$

当AWK可以为您运行不必要的应用程序时,不要运行它。

其他回答

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

下面将始终给出实际使用的shell -它获得实际可执行文件的名称,而不是shell名称(即ksh93而不是ksh,等等)。对于/bin/sh,它将显示实际使用的shell,即破折号。

ls -l /proc/$$/exe | sed 's%.*/%%'

我知道有很多人说ls输出永远不应该被处理,但是您所使用的shell以特殊字符命名,或者位于以特殊字符命名的目录中的可能性有多大?如果情况仍然如此,还有很多其他不同的做法。

正如托比·斯佩特(Toby Speight)所指出的,这将是实现相同目标的更适当、更干净的方式:

basename $(readlink /proc/$$/exe)

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

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

输出:

bash

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

你可以试试:

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

Or:

echo $SHELL

请使用以下命令:

ps -p $$ | tail -1 | awk '{print $4}'