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

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

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


当前回答

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

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

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

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

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

其他回答

一种方法是:

ps -p $$ -o exe=

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

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

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

没有一个答案适用于fish shell(它没有变量$$或$0)。

这适用于我(测试在sh, bash, fish, ksh, csh, true, tcsh,和zsh;openSUSE 13.2):

ps | tail -n 4 | sed -E '2,$d;s/.* (.*)/\1/'

该命令输出类似bash的字符串。这里我只使用ps、tail和sed(没有GNU扩展;尝试添加——posix来检查它)。它们都是标准的POSIX命令。我相信尾巴是可以去掉的,但是我的sed fu还不够强。

在我看来,这个解决方案不是很可移植,因为它不能在OS x上工作:(

这个在Red Hat Linux (RHEL), macOS, BSD和一些aix上运行良好:

ps -T $$ | awk 'NR==2{print $NF}' 

或者,如果pstree可用,下面的一个也应该工作,

pstree | egrep $$ | awk 'NR==2{print $NF}'

执行以下操作以了解您的shell是否使用Dash/Bash。

ls –la /bin/sh:

如果结果是/bin/sh -> /bin/bash ==>那么你的shell使用的是Bash。 如果结果是/bin/sh ->/bin/dash ==>那么你的shell使用的是dash。

如果你想从Bash更改为Dash或反之亦然,请使用下面的代码:

将shell更改为Bash

注意:如果上述命令导致错误提示/bin/sh已经存在,请删除/bin/sh后重试。

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