Linux shell
shell
shell(壳)这个词语在linux中有多种含义,可以理解为一种解释其的名称或者一门编程语言。在这里我们讨论的是shell解释器。
-
shell解释器:它是一个程序,为用户提供了一个界面来与操作系统交互。
-
shell脚本:指的是一种简单的、用于自动化任务的编程语言。
shell分类
-
sh(Bourne Shell):Unix最初的shell,由Stephen Bourne在AT&T Bell Labs开发,特点就是简单。
-
bash(Bourne Again Shell):是Bourne Shell的增强版,由Brian Fox为GNU项目开发,现在很多发行版使用的默认shell都是bash,它在sh的基础上加了很多高级特性。
-
csh(C Shell):语法和c语言类似,由Bill Joy在Berkeley Unix下开发
-
Ksh(Korn Shell):结合了Bourne Shell和C Shell的特点,由David Korn在AT&T Bell Labs开发
-
zsh(Z Shell):是bash的扩展,提供了更多高级的特性。
可以通过查看/etc/shells 文件中的内容来确认当前系统支持哪些类型的shell
cat /etc/shells
通过SHELL变量可以知道当前使用的shell类型
echo $SHELL
bash特点
-
命令行补全,按tab键可以补全命令
-
可以通过上下键来查看和回调以前输入的命令
-
允许用户同时运行多个进程,并在前台和后台之间切换
shell提示符
当我们打开一个命令行界面的时候,可以看到如下信息,这种就是shell的命令行提示符。
一般bash的命令行提示符由于格式为:当前用户@主机名 当前目录] #或$
这种提示符的显示格式是由PS1这个变量来控制的,可以通过修改PS1的值来输出自定义的提示符。
ubuntu:
centos:
\u 当前用户
\h 主机名简称
\H 主机名
\w 当前工作目录
例如:修改提示符颜色
PS1='\[\e[1;35m\][\u@\h \W]\\$\[\e[0m\]'
shell中执行命令
这里我们讨论的shell是shell解释器,通过在shell终端输入命令,shell终端会接收用户输入的命令进行解释处理。
命令格式:
命令 [参数] 对象 或 命令 [子命令] 对象
例如:查看一个文件的内容
# cat就是一个命令 -n就是这个命令的一个参数 /etc/passwd就是一个对象
cat -n /etc/passwd
命令 [子命令] 对象 这种命令格式一般是在较新的命令中使用。
例如:
# set-hostname就是hostnamectl的一个子命令
hostnamectl set-hostname node3
命令的参数
-
短选项:称为UNIX 风格选项,一个短横线后面跟一个字母。-c 例如:-l, -h
-
长选项:称为GNU风格选项,两个短横线后面跟一个完整的单词。--word 例如:--all, --human
-
BSD风格选项: 就一个字母,前面不加横线。例如:a,这种风格使用相对较少
例如:
# Unix风格
ps -ef
# GNU风格
ps aux
# BSD风格
ip a
命令分类
linux中的命令可以分为内部命令和外部命令,内部命令就是集成在shell解释器中的。外部命令就是在文件系统指定路径下的可执行文件。
可以通过type这个命令来区分某个命令时内部还是外部。
-
如果是内部命令:会提示“xxx is a shell builtin”
-
如果时外部命令,会显示完整的路径
例如:
root@ubuntu:~# type cd
cd is a shell builtin
root@ubuntu:~# type ifconfig
ifconfig is /usr/sbin/ifconfig
bash 快捷键
光标移动:
-
Ctrl + A:光标移到行首
-
Ctrl + E:光标移到行尾
程序控制:
-
Ctrl + C:终止当前进程
-
Ctrl + Z:当前的前台进程会被暂停并放入后台
-
Ctrl + D:退出当前 shell(如果输入行为空)
屏幕输出:
-
Ctrl + l:清空屏幕,和clear命令效果一直
-
Ctrl + s:阻止屏幕输出内容
-
Ctrl + q:允许屏幕输出,退出ctrl+s的锁定状态
命令执行简化过程
-
用户在命令行界面输入命令并按下 Enter
-
shell解释器解析用户的输入,将其分解为命令和参数
-
shell解释器会检查输入的命令是否是一个别名
-
判断命令是否是内置命令,如果是就直接执行,如果不是执行下一步
-
shell解释器会使用 PATH 环境变量中列出的目录来查找命令,找到后会启动一个新的进程来执行该命令
-
每个命令在结束时都会返回一个状态值,通常 0 表示成功,非 0 值表示有错误。
执行命令的优先级
别名 > 内部命令 > 外部命令
说明:如果内部命令和外部命令一样: 想要执行外部命令的方法: \commamd 或 'command'
hash缓存
hash是一个内置命令,作用就是用来记录并跟踪执行过的命令的完整路径,这样在再次执行相同的命令时,shell可以更快地找到它。
因为在执行一个外部命令时,shell必须在$PATH环境变量指定的所有目录中搜索该命令,直到找到为止。这样的搜索可能会因为 $PATH 中的目录太多而变得低效。为了优化这个查找过程,当命令首次被找到并执行后,shell会在hash表中存储该命令的完整路径。这样,下次你再运行该命令时,shell可以直接从hash表中查找命令的位置,而不需要再次搜索整个 $PATH。
问题;
有些时候将命令移动到其它位置了,也更改了PATH变量,但是第二次执行命令的时候会从hash缓存中找,这个时候就会出现找不到的情况,所以需要清空hash缓存。
-
查看hash缓存:hash
-
清除所有缓存:hash -r
-
清除指定命令的缓存:hash -d commmand_name
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了