Class1(2020):Shell基础(一)——Shell概念
Shell概念
本系列博客为MIT的《Missing in CS Class(2020)》的课程笔记。
注:
<>
或^
在本文中指Ctrl
,如c
或^c
指Ctrl-c
终端
-
<Ait+T>
:打开终端 -
<L>
:清空终端内容
流的概念
文件被视为连续的字节流进行处理。文件分为普通文件与设备文件。
-
普通文件:分为文本文件、二进制文件
-
设备文件:在Linux上,一切皆文件。操作系统有一组预定义的设备文件:标准设备文件。当进程运行时,操作系统会为每个进程自动打开标准设备文件。常见的标准设备文件:
-
标准输入流(
stdin
),通常为键盘,文件描述符为0
。 -
标准输出流(
stdout
),通常为显示器,文件描述符为1
。 -
标准错误流(
stderr
),文件描述符为2
。
-
路径
- 路径分隔符:
\
(Windows)/
(Linux) - 根目录:最顶层的目录。Windows:
盘符:\
;Linux:/
。 - 绝对路径:以根目录起始的路径
- 相对路径:以当前工作目录起始的路径
.
:当前工作目录..
:父目录
~
:当前用户的根工作目录-
:上次所在目录- 通配符:
*
:匹配任意长度 的字符;?
:匹配任意单个字符;{}
:表示某种集合,用于解释器的自动展开。如*{.c,.py}
表示任意c
文件与py
文件
环境变量
- Linux:
$PATH
。不同路径采用:
分隔 - Windows:
%PATH%
。不同路径下采用;
分隔。 - 当输入命令时,操作系统首先进入环境变量中顺序遍历寻找命令中使用的程序。
权限模型
在Linux下的权限模型中,每个文件/目录都具有权限控制。权限属于元信息,存储在对象的inode
节点内。权限分为三种:
r
:读。对于文件,代表可读取其中内容;对于目录,代表可查看目录中的内容w
:写。对于文件,代表可修改其中内容;对于目录,代表能修改该目录的内容,包括新建、删除、移动/重命名其中的文件或该目录本身。若仅对该目录中的文件可写,但对该目录不可写,则只能修改文件本身的内容,但无法删除文件。x
:执行。对于文件,代表可执行此文件;对于目录,代表能否进入该目录。注意与r
权限区分,进入目录与查看目录内容是不同的,进入目录是最基本的权限。仅当对目录拥有x
权限,才能对目录进行其他权限的操作。
Shell提示符(PS1)
Shell解释器配置文件位于用户主目录下以rc
为后缀的隐藏文件。如bash
则为~/.bashrc
。
下面以bash
为例,进入终端后:username@hostname:dirtype
-
username
:当前账户名,可使用whoami
程序查看 -
hostname
:当前主机名,可使用hostname
程序查看 -
dir
:当前工作目录。- 可使用
pwd
程序查看当前工作目录。 - 若要切换工作目录,可使用
cd dir
(Change Dir
)。当对dir
有执行权限(x
)时,更改当前工作目录至dir
。
- 可使用
-
type
:当前账户的类型。$
:非超级管理员(superadmin
)账户;#
:superadmin
账户,默认唯一的superadmin
账户为root
,uid=0-
sudo command
:在非superadmin
账户下,以root身份进行执行命令。不切换$PATH
。sudo
需要输入当前账户密码 -
su [username=root]
:切换其他账户,需要输入对方账户密码。不切换pwd
、$PATH
等
su -username
:切换其他账户。切换pwd
、$PATH
等
-
命令、程序及常用程序
- 命令:由若干个可能带有选项参数的程序组合而成的一组指令。在命令中使用后缀
&
使其在后台运行。
程序
-
程序选项:以
-
或--
开头,位于程序之后。-
后的选项为选项的简写,--
后的选项为其完整写法。 -
程序的返回值:
0
表示正常返回,非0代表出现错误。如C中main
函数的return
,实质上是在向操作系统返回程序运行结果。布尔型程序true
永远返回0,false
永远返回1。 -
逻辑运算:程序返回值的可参与逻辑运算,也被称为短路运算。
-
&&
:和运算符。对于一条含有该运算符的命令,仅当先前程序均执行成功(返回值均为0
)时,才继续执行之后的程序;当某个程序执行失败(返回值非0)时,停止执行该命令。 -
||
:或运算符,对于一条含有该运算符的命令,只要有程序执行成功(返回值为0
),停止执行该命令。
-
常用程序
-
man program
:程序帮助手册。 -
which program
:打印程序所在的绝对路径 -
date
:输出系统日期 -
echo string
:打印,将string
打印至stdout
-
ls dir
:查看某一目录下包含的文件/目录。若不指定dir
,则默认为当前工作目录。
选项:-l
:查看某一目录下文件/目录的详细元信息。例:
typepermission_string link_number owner groups number update_time name
type
:-
或d
。d
代表其为一个目录,-
表示其为一个普通文件。permission_string
:长度为9的权限字符串,每3个一组。每组顺次代表为该对象的所有者(Owner)、用户组(Groups)、其他人(Others)的权限。若有权限则用权限名表示;-
表示无该权限。可用chmod
命令修改权限。chmod +name
表示授予权限,chmod -name
表示移除权限number
:对于普通文件,表示文件的字节数;对于目录,表示目录项的数量。某一目录的目录项=普通文件数量+ 子目录的目录项数+1(表示..
,父目录)update_time
:表示最后的修改时间。使用touch name
修改文件/目录的更新时间,使用选项-t YYYYMMDDhhmm.ss
修改为指定时间YYYY-MM-DD hh:mm:ss
。若操作对象不存在,则新建空白文件。
-
find
:find dir options expression
:从dir
开始进行查找。- 选项:
-name "string"
:以对象名进行查找,可查找文件名、路径名。可使用通配符。 -type type
:type
:f
或d
- 选项:
-
diff
:Difference
,将两对象差异输出至stdout
。diff file1 file2
:输出两文件差异。仅在file1
中的内容前用表示,仅在`file2`中的内容前用
表示。- 选项:
-r dir1 dir2
:递归输出两目录差异。 - 选项:
-u file1 file2
:以人类友好的方式输出差异。 - 选项:
-q file1 file2
:只判断是否有差异,不输出差异内容。
-
grep
:文本的模式匹配grep "pattern" file
,file
可使用通配符。- 选项:
-i
:忽略模式串大小写 -r
:递归搜索目录下所有文件
- 选项:
-
mv
:Move
,移动文件/目录-
mv file newdir
:移动文件file
至新目录newdir
。file
数量可不固定,且可使用通配符。若newdir
不存在,则操作失败。如:将所有扩展名为.cpp
的文件移动到目录./1
中:mv *.cpp ./1
-
mv oldname newname
:若newname
不存在,则对操作对象重命名;若newname
存在:对于文件,则操作对象会替换newname
,对于目录,则操作对象会被移动并成为newname
的子目录。
-
-
cp
:Copy
,复制文件/目录-
cp file1 file2
:复制文件。若file2
已存在,则其将被替换 -
选项:
-r dir1 dir2
:递归复制文件夹内所有文件。若dir2
已存在,则dir1
被复制成为dir2
的子目录。
-
-
scp options SourceFile TargetPath
:主机间复制文件。- 接受远程地址:
Username@RemoteAddress:Path
- 选项:
-r
:递归复制文件夹内所有文件
- 接受远程地址:
-
mkdir dir
:Make Dir
,新建空文件夹 -
rm
:Remove
,删除操作对象rm file
:删除文件- 选项:
-r dir
:递归删除文件夹下的所有内容
-
rmdir dir
:当该文件夹为空时,则删除 -
cat file
:打印文件全部内容至stdout
-
tail file
:打印文件末尾内容。默认查看最后 行
选项:-n number
:打印文件末尾number
行 -
tee file
:将stdin
同时写入stdout
与file
中 -
journalctl
:打印系统日志 -
alias newname="oldname"
:为命令设置别名 -
jobs
:工作管理指令
流的重定向、连接
-
重定向输出流:
>
、>>
<command> > file
:覆盖地重定向输出流至文件<command> >> file
:追加地重定向输出流至文件
例:echo
命令通过重定向输出流的方式,可将字符串打印进文件中:echo string > file
n > file
:将文件描述符为n
的文件覆盖地重定向到文件。
如1 > file
:将stdout
重定向到file
n >> file
:将文件描述符为n
的文件追加地重定向到文件。n >& m
:将文件描述符n
的输出重定向到文件描述符m
。如command 2>&1
:将stderr
重定向到stdout
-
重定向输入流:
<
< file
:重定向输入流自文件,输入来自文件。
例:cat file
命令的本质即为cat < file
,通过重定向输入流以读取某文件内容并打印。n <& m
:将文件描述符m
的输入重定向到文件描述符n
。
-
例:使用
cat
命令实现文件复制:cat < file1 > file2
,cat
起到作为中转站的作用。-
cat
的输入流被重定向至file1
,其内容被读入cat
中 -
cat
的输出流被重定向自file2
,其内容被打印进file2
中
-
-
管道符:
|
,位于两程序之间,用于连接它们的流。用法:program1 | program2
,将program1
的stdout
作为program2
的stdin
。
进程通信
进程间通过信号进行通信。信号从1开始编号。
信号可由进程发出,也可用户手动发出:kill -SIGid PID
常用信号:
信号编号 | 信号名称 | 信号含义 |
---|---|---|
1 | SIGHUP | 终端挂起/控制进程结束br/若要忽略该信号,在运行程序的命令前使用nohup ,或对已运行的程序使用disown |
2 | SIGINT | 中断(Ctrl-C ) |
3 | SIGQUIT | 终止(Ctrl-\ ) |
9 | SIGKILL | 强制终止 |
11 | SIGSEGV | 段错误 |
15 | SIGTERM | 终止信号,通常为kill命令发送的信号 |
18 | SIGCONT | 继续执行暂停进程 |
19 | SIGSTOP | 暂停进程 |
20 | SIGTSTP | 终端挂起(Terminal Stop,CTRL-Z )br/之后可通过fg 或bg 分别在前台/后台继续进程 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具