确定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 中设置。