如何检查我使用的是哪个shell?

我读到终端只是shell,Unix提供了不同风格的shell:

  • Bourne shell(sh)
  • C shell(csh)
  • TC shell(tcsh)
  • Korn shell(ksh)
  • Bourne Again shell(bash)

问题:

  • 当我打开终端窗口时,默认打开哪个shell?
  • 如何检查安装了多少个shell?
  • 如何更改帐户中使用的shell?

您可以在终端中键入以下命令以查看您正在使用的shell:

echo $0 

如果您使用bashBourne Again Shell )终端,结果将类似于下面的内容:

 -bash 

要查找默认环境中的shell,可以检查SHELL环境变量的值:

 echo $SHELL 

要查找当前shell实例,请查找具有当前shell实例的PID的进程(shell)。

要查找当前shell实例的PID:

 echo "$$" 

现在找到具有PID的进程:

 ps -p  

把它放在一起:

 ps -p "$$" 

$SHELL为您提供默认shell。 $0为您提供当前的shell。

例如:我将bash作为我的默认shell,我将其用于终端应用程序。 但对于我的iTerm2应用程序,我在窗口打开时使用该命令: /bin/ksh

所以我的$0给了iTerm2上的/bin/ksh$SHELL在iTerm2上给我/bin/bash$0$SHELL在终端上给我/bin/bash

要知道哪个是您的用户的默认shell,您可以运行:

 echo "$SHELL" 

例如,如果您使用的是Bash,则应获得以下输出:

 /bin/bash 

如果你没有改变任何配置它应该是Bash,因为Bash它是Ubuntu上的默认shell。

其他答案倾向于使用shell特定function,但我们正在尝试发现我们正在使用哪个shell,因此他们假设问题的答案。 例如,没有一个答案适用于鱼类。

 sh -c 'ps -p $$ -o ppid=' | xargs ps -o cmd= -p 

而是在sh的调用中使用$$语法,但是我们正在寻找PPID而不是PID。 使用PPID查找cmd。

 sh -c 'ps -p $$ -o ppid=' | xargs -i readlink -f /proc/\{\}/exe 

感谢@muru的改进