Linux shell编程学习笔记2:我是谁 | who am i ?
〇、更新记录
20230926 补充例子2
一、前言
由于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表示脚本名称或函数名称)。
1.例子1:
[root@localhost ~]# echo $0
sh
可以看到我们当前使用的shell是历史最悠久的sh……其中[root@localhost ~]#是Linux系统终端的命令提示符,它的格式内容是可以自定义的,我们将会在以后学习。
2.例子2:
user@myhost:~>echo $0
bash
可以看到我们当前使用的shell是大多数系统默认的bash……其中user@myhost:~>是Linux系统终端的命令提示符,其内容跟例1是不同的,因为它的格式内容是可以自定义的,自定义的方法我们将会在以后学习。
(二)有点绕的办法
之所以说有点绕,是因为我们不能一步到位,需要执行两条命令:
第一条命令:
echo $$
这条命令将显示Shell本身的PID(ProcessID),
1.例子1:
[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……
2.例子2:
user@myhost:~>echo $$
14559
user@myhost:~>ps
PID TTY TIME CMD
6554 pts/0 00:00:00 ps
14559 pts/0 00:00:00 bash
user@myhost:~>
在第2个例子中,我们先查询到当前进程ID是14559,然后我们通过ps命令查询到PID等于14559的进程信息是bash。
(三) 不那么直观的方法
通过cat命令 查看/etc/passwd文件信息
cat /etc/passwd
从而了解用户的登录Shell类型。
1.例子1:
[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的信息。
2.例子2:
user@myhost:~>cat /etc/passwd | grep ^user
user:x:1002:1002:,,,:/home/user:/bin/bash
在这个例子中,我们可以看到当前使用的shell是bash
(四)不那么靠谱的方法
这种办法主要是用环境变量$SHELL。如:
echo $SHELL
$SHELL的值被设置为你的默认 shell 的完整路径,当你在终端中调用不同的 shell时,$SHELL的值并不会随之改变,它始终指向你的默认 shell 的完整路径。
实例:
user@myhost:~>echo $SHELL
/bin/bash
user@myhost:~>exec dash
\u@myhost:\w>echo $0
dash
\u@myhost:\w>echo $SHELL
/bin/bash
在上面的例中,我们首先使用echo $SHELL命令查询到系统默认的shell是bash
然后,我们使用exec dash命令将shell改为dash
接着我们使用echo $0命令证明我们当前使用的shell是dash
但是我们再次使用echo $SHELL命令查询,环境变量$SHELL的值并没有变成dash,仍然是默认的bash。
需要注意的是,$SHELL中的英文字母是大写的。也就是说,linux中的环境变量名称是区分大小英文字母的。$SHELL和$shell是两个环境变量。
相关文章:

Linux shell编程学习笔记2:我是谁 | who am i ?
〇、更新记录 20230926 补充例子2 一、前言 由于Linux系统的shell有许多种:sh、bash、cshell、tcsh、zsh……这些shell以sh为基础对象,在保持兼容性时又各有有创建,形成自己的功能特点,要想让我们编写的shell代码正确、可靠运行…...
移动端和PC端对比【组件库+调试vconsole +单位postcss-pxtorem+构建vite/webpack+可视化echarts/antv】
目录 组件库 移动端 vue vant PC端 react antd vue element 调试:vconsole vs dev tools中的控制台(Console) vconsole:在真机上调试 postcss-pxtorem:移动端不同的像素密度 构建工具 webpack 原理 Ba…...

maven多模块依赖包程序包xxx不存在
背景 rpc-common 被 rpc-server、rpc-client依赖 项目地址 https://github.com/pjmike/springboot-rpc-demo mvn clean install 打包时报错 报错信息 程序包xxxx不存在 找不到符号 原因分析 原因还不清楚,网友们帮解答一下 解决 主pom.xml 添加 <packaging…...

iOS17.0.2更新修复iPhone 15系列机型数据迁移问题,附新机快速数据迁移办法!
iPhone 15 系列机型已于今日正式发售,为解决iPhone15这些机型出现的数据迁移问题,苹果紧急发布了 iOS 17.0.2 更新,内部版本号为 21A350。 需要注意的是, iOS 17.0.2 更新仅适用于 iPhone 15、iPhone 15 Plus、iPhone 15 Pro 和 …...
面试题库(八):docker和linux
docker docker的原理?dockerfile里面用过什么命令?用过docker?dockerfile写过吗,常用命令,说下分层原理docker 部署有什么好处?docker 的底层原理是什么?namespace 和 cgroups,一个隔离环境,一个控制资源配额。那隔离环境主要隔离什么环境?docker镜像和容器有什么区别…...

深入理解传输层协议:TCP与UDP的比较与应用
目录 前言什么是TCP/UDPTCP/UDP应用TCP和UDP的对比总结 前言 传输层是TCP/IP协议栈中的第四层,它为应用程序提供服务,定义了主机应用程序之间端到端的连通性。在本文章,我们将深入探讨传输层协议,特别是TCP和UDP协议的原理和区别…...
Python-表白小程序练习
测试代码 在结果导向的今天,切勿眼高于顶,不论用任何方法能转换、拿出实际成果东西才是关键,即使一个制作很简易的程序,你想将其最终生成可运行的版本也是需要下一番功夫的。不要努力成为一个嘴炮成功者,要努力成为一个有价值的人…...
浅谈ChatGPT附免费体验地址
首先,让我来介绍一下ChatGPT是什么。ChatGPT是由OpenAI开发的大型语言模型,它代表着自然语言处理领域的最新进展。这个模型是通过大量的数据和先进的深度学习技术训练而成,具备了强大的语言理解和生成能力。 那么,ChatGPT能做些什…...

队列的使用以及模拟实现(C++版本)
🎈个人主页:🎈 :✨✨✨初阶牛✨✨✨ 🐻强烈推荐优质专栏: 🍔🍟🌯C的世界(持续更新中) 🐻推荐专栏1: 🍔🍟🌯C语言初阶 🐻推荐专栏2: 🍔…...

RV1126笔记四十一:RV1126移植LIVE555
若该文为原创文章,转载请注明原文出处。 RV1126的SDK有提供了一个librtsp.a封装好的RTSP推流库,但不开源,还有个确定延时长,所以想自己写一个RTSP的推流,但不想太麻烦,所以使用Live555。 记录下移植过程和测试结果。 live555需要用到的包有 openssl 和live555 一、 编…...

stable diffusion模型评价框架
GhostReview:全球第一套AI绘画ckpt评测框架代码 - 知乎大家好,我是_GhostInShell_,是全球AI绘画模型网站Civitai的All Time Highest Rated (全球历史最高评价) 第二名的GhostMix的作者。在上一篇文章,我主要探讨自己关于ckpt的发展方向的观点…...

电脑开机慢问题的简单处理
电脑用久了,开机时间要10-20分钟特别慢,一下介绍两种简单有效处理方式,这两种方式经测试不会影响原系统软件的使用: 方式一:禁用非必要启动项【效果不是很明显】 利用360里面的优化加速禁用启动项【禁用启动项还有其…...
SpringMVC-Rest风格
一、简介 REST(Representational State Transfer),表现形式状态转换,它是一种软件架构风格 当我们想表示一个网络资源的时候,可以使用两种方式: 传统风格资源描述形式 http://localhost/user/getById?id1 查询id为1的用户信息…...

WebGL实现透明物体(α混合)
目录 α混合 如何实现α混合 1. 开启混合功能: 2. 指定混合函数 混合函数 gl.blendFunc()函数规范 可以指定给src_factor和dst_factor的常量 混合后颜色的计算公式 加法混合 半透明的三角形(LookAtBlendedTriangl…...

RecycleView刷新功能
RecycleView刷新某一个Item,或这某一个Item中某一个View。 这样的需求,在实际的开发中是很普遍的。 在数据变化后需要刷新列表。 刷新列表有三种方式: 前两种大家应该很熟,第三中会有点陌生。 那么这三种方式,有什…...

目标检测如何演变:从区域提议和 Haar 级联到零样本技术
目录 一、说明 二、目标检测路线图 2.1 路线图(一般) 2.2 路线图(更传统的方法) 2.3 路线图(深度学习方法) 2.4 对象检测指标的改进 三、传统检测方法 3.1 维奥拉-琼斯探测器 (2001) 3.2 HOG探测器…...
聊一聊国内大模型公司,大模型面试心得、经验、感受
有着过硬的技术却无处可用是不是很苦恼呢,大家在面试时是不是也积累了一些经验呢,本文详细总结了大佬在大模型面试时的一些经验及感悟,希望对大家面试找工作有所帮助。 2023年,大模型突然国内火了起来,笔者就面了一些…...
【分布式微服务】feign 异步调用获取不到ServletRequestAttributes
公司调用接口的时候使用feign,但是服务之间还是使用了鉴权,需要通过RequestInterceptor 去传递uuid 概念 OpenFeign是一个声明式的Web服务客户端,它使得编写HTTP客户端变得更简单。在使用OpenFeign进行异步调用时,你可以通过配置来实现。但是,如果你在配置或调用过程中遇…...
c#编程里面最复杂的技术问题有哪些
C#编程中最复杂的技术问题通常涉及高级主题和复杂的应用场景。以下是一些可能被认为是C#编程中最复杂的技术问题: 1. **多线程和并发编程:** 处理多线程和并发问题涉及到锁定、线程同步、死锁避免、线程安全性和性能优化等方面的知识。编写高效且线程安…...

github代码提交过程详细介绍
1、下载github上面的代码 (1)在github网站上,找到想要下载的代码仓库界面,点击Code选项就可以看到仓库的git下载地址; (2)使用命令下载:git clone 地址; 2、配置本地git…...

地震勘探——干扰波识别、井中地震时距曲线特点
目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...

从WWDC看苹果产品发展的规律
WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...
Cesium1.95中高性能加载1500个点
一、基本方式: 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

【网络安全产品大调研系列】2. 体验漏洞扫描
前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...
oracle与MySQL数据库之间数据同步的技术要点
Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异ÿ…...
Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器
第一章 引言:语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域,文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量,支撑着搜索引擎、推荐系统、…...

使用LangGraph和LangSmith构建多智能体人工智能系统
现在,通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战,比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...

云原生安全实战:API网关Kong的鉴权与限流详解
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关(API Gateway) API网关是微服务架构中的核心组件,负责统一管理所有API的流量入口。它像一座…...

毫米波雷达基础理论(3D+4D)
3D、4D毫米波雷达基础知识及厂商选型 PreView : https://mp.weixin.qq.com/s/bQkju4r6med7I3TBGJI_bQ 1. FMCW毫米波雷达基础知识 主要参考博文: 一文入门汽车毫米波雷达基本原理 :https://mp.weixin.qq.com/s/_EN7A5lKcz2Eh8dLnjE19w 毫米波雷达基础…...