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

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

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


当前回答

我想到了这个:

sed 's/.*SHELL=//; s/[[:upper:]].*//' /proc/$$/environ

其他回答

我尝试过许多不同的方法,对我来说最好的方法是:

ps -p $$

它也可以在Cygwin下工作,并且不能像PID grepping那样产生假阳性。经过一些清理,它只输出一个可执行名称(在Cygwin With path下):

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

你可以创建一个函数,这样你就不必记住它:

# Print currently active shell
shell () {
  ps -p $$ | tail -1 | awk '{print $NF}'
}

…然后执行shell。

它在Debian和Cygwin下进行了测试。

Try

ps -p $$ -oargs=

or

ps -p $$ -ocomm=

我对打印父进程的变体:

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

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

没有一个答案适用于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上工作:(

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

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

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