计算机工具基础(二)——Shell概念、常用POSIX命令
Shell概念
本系列博客为MIT的《Missing in CS Class(2020)》的课程笔记。
注:
<>或^在本文中指Ctrl,如c或^c指Ctrl-c
终端(命令行,CLI)
-
<Alt+T>:打开终端 -
<L>:清空终端内容
流的概念
文件被视为连续的字节流进行处理。文件分为普通文件与设备文件。
-
普通文件:分为文本文件、二进制文件
-
设备文件:在Linux上,一切皆文件。操作系统有一组预定义的设备文件:标准设备文件。当进程运行时,操作系统会为每个进程自动打开标准设备文件。常见的标准设备文件:
-
标准输入流(
stdin),通常为键盘,文件描述符为0。 -
标准输出流(
stdout),通常为显示器,文件描述符为1。 -
标准错误流(
stderr),文件描述符为2。
-
路径
- 路径分隔符:
\(Windows)/(Linux) - 根目录:最顶层的目录。Windows:
盘符:\;Linux:/。 - 绝对路径:以根目录起始的路径
- 相对路径:以当前工作目录起始的路径
.:当前工作目录..:父目录
~:当前用户的根工作目录-:上次所在目录
通配符
*:匹配任意长度\(\ge 0\)的字符?:匹配任意单个字符{}:表示某种集合,用于解释器的自动展开。如*{.c,.py}表示任意扩展名为c及py的文件
环境变量
- Linux:
$PATH。不同路径采用:分隔 - Windows:
%PATH%。不同路径下采用;分隔。 - 当输入命令时,操作系统首先进入环境变量中顺序遍历寻找命令中使用的程序。
权限模型
在Linux下的权限模型中,每个文件/目录都具有权限控制。权限属于元信息,存储在对象的inode节点内。权限分为三种:
r:读。对于文件,代表可读取其中内容;对于目录,代表可查看目录中的内容w:写。对于文件,代表可修改其中内容;对于目录,代表能修改该目录的内容,包括新建、删除、移动/重命名其中的文件或该目录本身。若仅对该目录中的文件可写,但对该目录不可写,则只能修改文件本身的内容,但无法删除文件。x:执行。对于文件,代表可执行此文件;对于目录,代表能否进入该目录。注意与r权限区分,进入目录与查看目录内容是不同的,进入目录是最基本的权限。仅当对目录拥有x权限,才能对目录进行其他权限的操作。
Shell提示符(PS1)
Shell解释器配置文件位于用户主目录下以rc为后缀的隐藏文件。如bash则为~/.bashrc。
下面以bash为例,进入终端后:Username@Hostname:dir type
-
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 nametype:-或d。d代表其为一个目录,-表示其为一个普通文件。permission_string:长度为9的权限字符串,每3个一组。每组顺次代表为该对象的所有者(Owner)、用户组(Groups)、其他人(Others)的权限。若有权限则用权限名表示;-表示无该权限。可用chmod命令修改权限。chmod +name表示授予权限,chmod -name表示移除权限number:对于普通文件,表示文件的字节数;对于目录,表示目录项的数量。某一目录的目录项=普通文件数量+\(\sum\)子目录的目录项数+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的子目录。
-
-
mkdir dir:Make Dir,新建空文件夹- 选项:
-p:逐级创建目录,若不存在就创建它
- 选项:
-
rm:Remove,删除操作对象rm file:删除文件- 选项:
-r dir:递归删除文件夹下的所有内容
-
rmdir dir:当该文件夹为空时,则删除 -
cat file:打印文件全部内容至stdout -
tail file:打印文件末尾内容。默认查看最后\(10\)行
选项:-n number:打印文件末尾number行 -
tee file:将stdin同时写入stdout与file中 -
journalctl:打印系统日志 -
alias newname="oldname":为命令设置别名 -
jobs:工作管理指令 -
ssh Username@RemoteHost:ssh登录主机RemoteHost,默认端口22。默认以密码登录。- 选项:
-p port:指定主机端口
- 选项:
-
scp options SourceFile TargetPath:主机间复制文件。仅支持本地与远程,不支持远程与远程。- 接受远程地址:
Username@RemoteHost:Path - 选项:
-r:递归复制文件夹内所有文件
-P port:指定主机端口
- 接受远程地址:
-
ftp:文件传输协议(File Transport Protool)ftp RemoteHost:连接到远程主机,默认端口21。若支持匿名则直接登录,否则以交互式询问账户密码。ls:列出远程目录pwd:打印远程所在目录lpwd:打印本地所在目录cd:切换远程目录lcd:切换本地目录mkdir:在远程新建文件夹rmdir:在远程删除文件夹delete:删除远程单个文件mdelete:删除远程多个文件rename:重命名远程文件chmod:设置远程文件权限ascii、binary:设置传输模式为ACSII或二进制。get:下载文件mget:批量下载文件,常与通配符结合使用。put:上传文件mput:批量上传文件,常与通配符结合使用。bye/quit:退出- 不支持移动和复制文件。
-
sftp:基于SSH的文件传输协议,为SSH的子系统,与FTP是两种截然不同的协议。下面仅列出与ftp不同的命令:sftp Username@RemoteHost:连接到远程主机,默认端口22。需显式指定用户名。rm:删除文件。get:下载单个文件,可使用-r选项递归下载文件。不支持mget。put:上传单个文件,使用-r选项递归上传文件。不支持mput。bye/exit:退出- 不支持移动和复制文件。
流的重定向、连接
-
重定向输出流:
>、>><command> > file:覆盖地重定向输出流至文件<command> >> file:追加地重定向输出流至文件
例:echo命令通过重定向输出流的方式,可将字符串打印进文件中:echo string > filen > file:将文件描述符为n的文件覆盖地重定向到文件。
如1 > file:将stdout重定向到filen >> 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分别在前台/后台继续进程 |

浙公网安备 33010602011771号