Linux shell编程学习笔记2:我是谁 | who am i ?

一、前言

由于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 的完整路径。

相关推荐
Ruiery3 小时前
Linux 6.6内核内存管理深度解析(十六):mmap — 用户态“申请内存“的真相
linux·运维·服务器
欧米欧4 小时前
Linux系统篇(七),环境变量的底层溯源,核心获取机制与安全应用
linux·运维·服务器
Ruiery4 小时前
Linux 6.6内核内存管理深度解析(十八):KASLR 内核地址空间随机化
linux·运维·服务器·安全
qetfw5 小时前
UOS MariaDB 数据库:安装、最小权限与备份验证
linux·数据库·mariadb·uos
一木 之林6 小时前
Dify学习笔记 03 · RAG检索增强生成:三代范式、评估与落地(第40-45、55-56集)
笔记·小程序·交互·dify
逆风的蚂蚁6 小时前
linux服务器性能调整怎么落地?我把 CPU 调度、I/O 优先级和内核参数这几个旋钮都拧了一遍
linux·运维·服务器
apple-mapping7 小时前
网络RTK定位学习总结
学习·网络rtk
楚山之石7 小时前
【Lancet Neurology 】多发性硬化认知障碍的 SDMT 筛查、灰质萎缩标志与认知康复循证路径
图像处理·人工智能·学习·mri
海海不掉头发9 小时前
CSDN博客_时序预测9模型复现对比
人工智能·学习·软件工程
沫璃染墨10 小时前
从零入门计算机网络系列(十一):HTTP协议进阶——从重定向原理到GET/POST与Fiddler抓包
linux·服务器·开发语言·网络·c++·tcp/ip·html