Contents

确定Linux中的当前Shell

1. 概述

shell 是一个为操作系统提供命令行界面的程序。

Linux 和类 Unix 操作系统为用户提供不同的 shell。Bash(Bourne Again Shell)、csh(C Shell)、ksh(Korn Shell)和sh(Bourne Shell)是最常见的。

在本教程中,我们将研究各种方法来找出我们正在使用的当前 shell。

2. 使用echo命令

Linux 中的*echo *命令用于显示作为参数传递给它的一行文本或字符串。我们也可以使用这个命令来打印当前的 shell。

2.1. echo $SHELL

$SHELL变量包含默认 shell的名称。我们可以显示它的值:

$ echo $SHELL
/bin/bash

虽然这种方法在大多数情况下都有效,但它不是一种可靠的方法,因为当前运行的 shell 可能不是默认 shell。

2.2. echo $0

我们还可以使用带有*$0*变量的 echo 命令:

$ echo $0
bash

**这种方法在命令行上效果很好,但在脚本中却不行。**在脚本文件中,$0变量不会打印当前的 shell。相反,它会打印文件或程序的名称。

3. 使用ps命令

ps (进程状态)命令提供当前正在运行的进程的快照:

$ ps
  PID TTY          TIME CMD
 4467 pts/0    00:00:00 bash
 5379 pts/0    00:00:00 ps

输出中的最后一列 CMD 显示 bash shell 当前正在运行。

4. 查看*/etc/passwd*文件

/etc/passwd文件是 Linux 中的纯文本文件,其中包含用户的帐户信息,例如用户名、用户 ID、组 ID、主目录和 shell。

使用*grep *命令,我们可以在此文件中搜索以当前登录用户的用户名开头的字符串:

$ grep "^$USER" /etc/passwd
vroot:x:1000:1000:Vroot:/home/vroot:/bin/bash

输出的最后一部分显示默认 shell 是 bash。同样,这不是一种可靠的方法,因为默认 shell 可能并不总是当前 shell。

5. 使用lsof命令

lsof 命令列出所有正在运行的进程的所有打开文件。我们可以将此命令与-p选项一起使用,以仅选择属于当前 shell 进程 ID 的文件:

$ lsof -p $$
COMMAND  PID     USER   FD   TYPE DEVICE  SIZE/OFF    NODE NAME
bash    2796 vroot  cwd    DIR  253,2      4096 2097153 /home/vroot
bash    2796 vroot  rtd    DIR  253,0      4096       2 /
bash    2796 vroot  txt    REG  253,0   1514000 2490662 /usr/bin/bash
bash    2796 vroot  mem    REG  253,0   8406312  131168 /var/lib/sss/mc/passwd
............... other lines omitted ...................................
bash    2796 vroot  255u   CHR  136,0       0t0       3 /dev/pts/0

*$$*是一个特殊参数,它扩展为当前 shell 的进程 ID 。

输出中的第一列COMMAND显示正在运行的 shell 是 bash。

6. 使用readlink命令

readlink 命令打印已解析的符号链接或规范文件名。/proc/[pid]/exe是一个符号链接,其中包含带有进程 id 的已执行命令的实际路径名pid

我们可以使用*$$特殊参数在当前 shell 的进程 id 上运行readlink* :

$ readlink /proc/$$/exe
/usr/bin/bash

从shell命令的路径名,我们可以推断出我们正在运行的shell是bash。

7. 使用*/proc/$$/cmdline*

/proc/[pid]/cmdline是一个只读文件,其中包含 id 为pid的任何进程的完整命令行。

我们可以使用*$$特殊参数作为pid*:

$ cat /proc/$$/cmdline
bash 

输出显示我们正在运行 bash shell。

8. 其他方法

有时,我们研究的任何方法都可能不起作用。如果可执行文件与正在运行的 shell 不匹配,就会发生这种情况。

在这种情况下,我们可以查看一些特定于 shell 的环境变量来推断正在运行的 shell。

例如,如果它是 bash shell,将设置*$BASH变量。同样,在 tcsh shell 中,将设置$version*变量。

$PS1和*$PS2变量在 sh shell 中设置,而$ PS3$PS4*变量在 ksh shell 中设置。