一、前言
由于Linux系统的shell有许多种:sh、bash、cshell、tcsh、zsh……这些shell以sh为基础对象,在保持兼容性时又各有有创建,形成自己的功能特点,要想让我们编写的shell代码正确、可靠运行,我们首先应该了解我们的目标系统在登陆后默认使用的是哪个shell,也就是我是谁 | whoami?
二、示例约定
从现在开始,我们就要逐步学习在终端中输入和执行linux命令并根据需要进行编程,这与DOS是相似的。
按照DOS下的惯例,我们在命令提示符后通过键盘输入命令并按下Enter来执行。我们输入的的命令将使用下划线标注。
三、who am i?
linux提供了who am i 或 whoami命令,不过命令的功能用来查询当前登陆系统的帐号信息。
所以如果我们要查询当前使用的shell类型,实际上使用的是其它命令和方法。
要查询我们当前使用的shell类型,有很多种方法,有些很直接,一步到位;有些方法则需要绕一些,通过几个命令配合实现,或者不那么直观,有些则不太靠谱。
(一)最直接的方法
要想知道我们当前使用的shell类别,比较好的方法是使用命令:
echo $0
其中$0的含义要看具体应用场合,像上面这样在命令行中使用,它代表的是Shell本身的PID(ProcessID ),(btw,如果是在脚本中使用,$0表示脚本名称或函数名称),例如:
[root@localhost ~]# echo $0
sh
可以看到我们当前使用的shell是历史最悠久的sh……其中[root@localhost ~]是Linux系统终端的命令提示符,它的格式内容是可以自定义的,我们将会在以后学习。
(二)有点绕的办法
之所以说有点绕,是因为我们不能一步到位,需要执行两条命令:
第一条命令:
echo $$
这条命令将显示Shell本身的PID(ProcessID),例如:
[root@localhost ~]# echo $$
64
在上面这个例子中,我们可以知道当前进程ID是64。 接下来我们执行第二条命令:
ps
这条命令用于显示当前进程的信息,类似于 Windows 系统中的控制台命令tastlist,例如:
[root@localhost ~]# ps
PID USER COMMAND
1 root {init} /bin/sh /sbin/init
2 root [kthreadd]
3 root [kworker/0:0]
4 root [kworker/0:0H]
5 root [kworker/u2:0]
6 root [mm_percpu_wq]
7 root [ksoftirqd/0]
8 root [kdevtmpfs]
9 root [netns]
10 root [oom_reaper]
11 root [writeback]
12 root [crypto]
13 root [kblockd]
14 root [kswapd0]
15 root [kworker/0:1]
32 root [khvcd]
33 root [kworker/0:2]
43 root dhcpcd
56 root [kworker/u2:1]
64 root sh -l
66 root ps
从ps命令显示的进程信息中,我们可以看到PID等于64的进程信息是:
64 root sh -l
这样我们就知道我们现在用的shell是历史最悠久的sh……
(三) 不那么直观的方法
通过cat命令 查看/etc/passwd文件信息
cat /etc/passwd
从而了解用户的登录Shell类型,比如:
[root@localhost ~]# cat /etc/passwd
cat /etc/passwd
root:x:0:0:root:/root:/bin/sh
daemon:x:1:1:daemon:/usr/sbin:/bin/false
bin:x:2:2:bin:/bin:/bin/false
sys:x:3:3:sys:/dev:/bin/false
sync:x:4:100:sync:/bin:/bin/sync
mail:x:8:8:mail:/var/spool/mail:/bin/false
www-data:x:33:33:www-data:/var/www:/bin/false
operator:x:37:37:Operator:/var:/bin/false
nobody:x:99:99:nobody:/home:/bin/false
从中我们可以看到,root帐户登陆系统后使用的shell是sh。
为了更直观一些,我们可以使用 管道操作 利用grep命令搜索包含字符串root的行,即:
cat /etc/passwd | grep ^root
例如:
[root@localhost ~]# cat /etc/passwd | grep ^root
cat /etc/passwd | grep ^root
root:x:0:0:root:/root:/bin/sh
命令执行后系统只显示包含字符串root的信息。
(四)不那么靠谱的方法
这种办法主要是用环境变量$SHELL。如:
echo $SHELL
$SHELL的值被设置为你的默认 shell 的完整路径,当你在终端中调用不同的 shell时,$SHELL的值并不会随之改变,它始终指向你的默认 shell 的完整路径。