计算机工具基础(二)——Shell概念、常用POSIX命令

Shell概念

本系列博客为MIT的《Missing in CS Class(2020)》的课程笔记。

注:<>^在本文中指Ctrl,如c^cCtrl-c

终端(命令行,CLI)

  • <Alt+T>:打开终端

  • <L>:清空终端内容

流的概念

文件被视为连续的字节流进行处理。文件分为普通文件与设备文件。

  • 普通文件:分为文本文件、二进制文件

  • 设备文件:在Linux上,一切皆文件。操作系统有一组预定义的设备文件:标准设备文件。当进程运行时,操作系统会为每个进程自动打开标准设备文件。常见的标准设备文件:

    • 标准输入流(stdin),通常为键盘,文件描述符为0

    • 标准输出流(stdout),通常为显示器,文件描述符为1

    • 标准错误流(stderr),文件描述符为2

路径

  • 路径分隔符:\(Windows) /(Linux)
  • 根目录:最顶层的目录。Windows:盘符:\;Linux:/
  • 绝对路径:以根目录起始的路径
  • 相对路径:以当前工作目录起始的路径
    • .:当前工作目录
    • ..:父目录
  • ~:当前用户的根工作目录
  • -:上次所在目录

通配符

  • *:匹配任意长度\(\ge 0\)的字符
  • ?:匹配任意单个字符
  • {}:表示某种集合,用于解释器的自动展开。如*{.c,.py}表示任意扩展名为cpy的文件

环境变量

  • 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身份进行执行命令。不切换$PATHsudo需要输入当前账户密码

    • 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-dd代表其为一个目录,-表示其为一个普通文件。
    • 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。若操作对象不存在,则新建空白文件
  • findfind dir options expression:从dir开始进行查找。

    • 选项:-name "string":以对象名进行查找,可查找文件名、路径名。可使用通配符。
    • -type typetypefd
  • diffDifference,将两对象差异输出至stdout

    • diff file1 file2:输出两文件差异。仅在file1中的内容前用表示,仅在`file2`中的内容前用表示。
    • 选项:-r dir1 dir2:递归输出两目录差异。
    • 选项:-u file1 file2:以人类友好的方式输出差异。
    • 选项:-q file1 file2:只判断是否有差异,不输出差异内容。
  • grep:文本的模式匹配 grep "pattern" filefile可使用通配符。

    • 选项:-i:忽略模式串大小写
    • -r:递归搜索目录下所有文件
  • mvMove,移动文件/目录

    • mv file newdir:移动文件file至新目录newdirfile数量可不固定,且可使用通配符。若newdir不存在,则操作失败。如:将所有扩展名为.cpp的文件移动到目录./1中:mv *.cpp ./1

    • mv oldname newname:若newname不存在,则对操作对象重命名;若newname存在:对于文件,则操作对象会替换newname,对于目录,则操作对象会被移动并成为newname的子目录。

  • cpCopy,复制文件/目录

    • cp file1 file2 :复制文件。若file2已存在,则其将被替换

    • 选项:-r dir1 dir2:递归复制文件夹内所有文件。若dir2已存在,则dir1被复制成为dir2的子目录。

  • mkdir dirMake Dir,新建空文件夹

    • 选项:-p:逐级创建目录,若不存在就创建它
  • rmRemove,删除操作对象

    • rm file:删除文件
    • 选项:-r dir:递归删除文件夹下的所有内容
  • rmdir dir:当该文件夹为空时,则删除

  • cat file:打印文件全部内容至stdout

  • tail file:打印文件末尾内容。默认查看最后\(10\)
    选项:-n number:打印文件末尾number

  • tee file:将stdin同时写入stdoutfile

  • 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:设置远程文件权限
    • asciibinary:设置传输模式为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 > 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 > file2cat起到作为中转站的作用。

    • cat的输入流被重定向至file1,其内容被读入cat

    • cat的输出流被重定向自file2,其内容被打印进file2

  • 管道符:|,位于两程序之间,用于连接它们的流。用法:program1 | program2,将program1stdout作为program2stdin

进程通信

进程间通过信号进行通信。信号从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/之后可通过fgbg分别在前台/后台继续进程
posted @ 2025-01-23 20:31  椰萝Yerosius  阅读(30)  评论(0)    收藏  举报  来源