Skip to content

Latest commit

 

History

History
320 lines (282 loc) · 11.6 KB

command.md

File metadata and controls

320 lines (282 loc) · 11.6 KB

常用指令

下面只列出最基础的用法,如需了解指令的更多参数和用法请自行查找资料

用中括号[]包裹的参数为可选参数

一般而言,可以用man cmdcmd --helpcmd -h查看关于命令cmd的说明和帮助

俗话说:“没有消息就是最好的消息”,Linux 下很多指令成功执行时都没有输出,只要确认输入正确,就无需担心运行结果是否正确。如仍需校验结果,常常需要使用不同指令辅助。

目录


切换当前工作目录 cd

  • 用法:cd [<path>]
  • Change Directory,切换当前工作目录至path,或者说移至(打开)path
  • path可以使用绝对路径或相对路径表示
  • 特殊用法:
    • path缺省时默认为用户目录~,即cd等价于cd ~
    • cd -:回到上个访问的目录

输出当前工作目录 pwd

  • 用法:pwd
  • Print Work Directory,输出当前工作目录的绝对路径

列出目录文件

ls

  • 用法:ls [-a] [-l] [-h] [<path>]
  • 列出path下的所有文件(夹)
  • path缺省时默认为当前目录.,即ls等价于ls .
  • 使用-a时列出包括隐藏文件(.开头的文件)
  • 使用-l时列出包括文件权限、大小、创建时间在内的详细信息(类比 Windows 资源管理器从列表模式改成详细信息模式)
  • 使用-h时将文件大小带单位输出,便于阅读,需配合-l使用

tree

  • 用法:tree <path>
  • 列出path下的所有文件(夹)和所有子文件(夹),用文件树的形式输出
  • path默认为当前目录.,即ls等价于ls .

创建文件 touch、创建目录 mkdir

  • 用法:touch <name>mkdir <name>
  • 创建一个叫name的空文件/空目录

编辑文件

移动 mv、复制cp

  • 用法:mv <src> <dst>cp <src> <dst>
  • 将文件从src移动/复制到dst
  • dst可以为
    • 一个已存在的目录,此时会把src移动/复制到该目录下
    • 一个不存在的文件/目录,此时src必须为一个文件/目录
  • src可以是多个文件,此时dst必须为一个已存在的目录

删除

删除空目录 rmdir

  • 用法:rmdir <dir>
  • 将空目录dir删除,若非空则报错

删除文件 rm

  • 用法:rm [-R] <path>
  • 删除path指定的文件
  • 使用-R时采用递归删除的方式,删除path指定的目录和其中所有的子目录/文件。不使用-Rpath为目录时报错

原样输出 echo

  • 用法:echo <text>
  • 输出text
  • 常用于脚本中(类比 c 语言 printf 使用)或配合输出重定向符使用

输出文件

输出全文 cat

  • 用法:cat <file>
  • 输出file的内容
  • Note:当文件过大时可能造成卡顿,请考虑使用headtail

输出头行 head、输出尾行 tail

  • 用法:head <file> [-n <lines>]tail <file> [-n <lines>]
  • 输出file头部/尾部lines行的内容,默认为10行

输出差异 diff

  • 用法:diff <file1> <file2>
  • 逐行比较两个文件的差异并输出不同的行
  • 如果两个文件没有差异则无输出

文本匹配和筛选 grep

  • 用法:grep [-i] <pattern> <file>
  • 在文件file中查找带有pattern的行并输出
  • pattern可以是一个正则表达式
  • 使用-i时忽略大小写
  • 注:常与管道符联合使用
  • 注:grepawksed有时并称“Linux 三剑客”,它们有着比此处所提及到更强大的功能,但由于课程一般使用不到,请有兴趣的同学自行了解
  • 示例:
    $ cat config.json
    {
    ...
      "USERNAME": "some-user",
      "password": "this_is_a_passwd",
    ...
    }
    
    $ grep -i username config.json
      "USERNAME": "some-user",
    $ grep username config.json
    // 无输出(未指定-i,config.json文档中没有匹配小写username的行)
    

更改文件权限 chmod

  • 用法:chmod <permission> <path>
  • path指定的文件(夹)赋予权限permission,它可以是
    • +r+w+x,表示授予读、写、执行权限
    • -r-w-x,表示撤销读、写、执行权限
    • 上面写法可以连用,例如+rw表示授予读写权限
    • 3位8进制数,见文件权限一节

更改文件所有者 chown

  • 用法:chown <user>:<group> <path>
  • path指定的文件(夹)的所有者更改为user:group

用户手册 man

  • 用法:man <指令>
  • 查看指令的用户手册
  • 使用阅读模式

切换用户 su

  • 用法:su [<user>]
  • 切换至user,需要输入user的密码
  • user缺省时默认为当前用户,一般来讲没有作用,但考虑下面这种做法:
    user1@host:~$ sudo -u user2 su
    // 由于使用了 sudo -u,该命令被认为是以 user2 身份执行
    // su 后面缺省了参数,故会将用户切换为 user2
    // 而 sudo 是 user1 执行的,故需要输入的是 user1 的密码
    
  • 常见特殊用法:直接su root需要使用root的密码,该密码一般是用户未知、或者出于安全考虑被禁用的;而sudo su可以切换至root用户,只需输入自己的密码
    user1@host:~$ su root
    Password: // 应输入 root 的密码,未知或禁用
    user1@host:~$ sudo su
    [sudo] Password of user1: // 应输入 user1 的密码,已知
    // sudo su 等价于 sudo -u root su root,请参考这两个命令的缺省值理解
    

sudo

  • 用法:sudo [-u <user>] <指令>
  • 以其它用户的身份执行指令
  • 不使用[-u <user>]时默认为root用户
  • 短期内首次使用时会要求输入当前用户的密码
  • 示例:
    $ sudo apt update
    $ sudo reboot
    

特殊符号

&&、或 ||;

  • 用法:<指令1> && <指令2><指令1> || <指令2><指令1> ; <指令2>
  • 前一个指令成功失败无条件执行后一个指令
  • 这三个用法可以类比 c 语言程序:
    • 当指令成功时返回值为0,因此与类似于if (func1()==0 && func2()==0) ;
    • ||同理
    • ;则与 c 几乎完全相同,类似于func1(); func2();
  • 注意:sudo <指令>将被当作一个指令整体,即sudo <指令1> && <指令2>只有指令1获得了超级用户权限
  • 示例:
    $ gcc hw1.c -o hw1 && ./hw1   // 编译 hw1.c 到 hw1 并在编译成功时运行它
    $ cd ~/COD-Lab && git pull    // 移动到 ~/COD-Lab 路径下并执行 git pull 拉取仓库
    $ sudo apt update && apt upgrade      // 错误:后一个 apt upgrade 指令没有 sudo 权限
    $ sudo apt update && sudo apt upgrade // 正确:先执行更新软件源,随后更新所有软件包
    

管道符 |

  • 用法:<指令1> | <指令2>
  • 简单来说,它是把指令1的输出作为指令2的输入进行执行
  • 常见用于grep指令,例如cat <file> | grep <text>等价于grep <text> <file>
  • 示例(config.json文件内容见 grep):
    $ cat config.json | grep -i username
      "USERNAME": "some-user",
    $ cat config.json | grep password
      "password": "this_is_a_passwd",
    

输出重定向符 >>>

  • 用法:<指令> > <file><指令> >> <file>
  • 将指令的输出放入file,前者会覆盖文件原本的内容,后者则增添到尾部
  • 示例:
    $ echo 123 > test
    $ cat test
    123
    
    $ echo 456 >> test
    $ cat test
    123
    456
    
    $ echo 789 > test
    $ cat test
    789
    

多行输入\

  • 当一个指令需要多行输入时(通常是为了人读起来更方便),在除了最后一行外每行结尾增加\
  • 后续行的标识符将变成>,而不再是$#
  • 示例:
    $ echo 123\
    > 456 \            // 注意本行的 \ 前有一个空格
    > 789
    123456 789
    // 完全等价于 echo 123456 789
    
    $ docker run -p 80:80 \
    > -v /data:/data \
    > -d nginx:latest
    // 完全等价于 docker run -p 80:80 -v /data:/data -d nginx:latest
    // 用于分割参数时必须在 \ 前带一个空格,否则↓
    
    $ docker run -p 80:80\
    > -d nginx:latest
    docker: Invalid containerPort: 80-d
    // 由于缺少空格,这行命令实际等价于 docker run -p 80:80-d nginx:latest,注意到 80-d 连在了一起,而它不是一个有效的端口号,故报错
    

安装软件

ssh

git

退出 exit

  • 用法:exit
  • 退出当前终端

电源管理

shutdown

  • 用法:shutdown [<-r>] [<-h>] <time> [<message>]
  • 关机或重启
  • 使用-r时重启
  • 使用-h时关机
  • <time>为倒计时,默认单位为分钟。可以是now
  • [message]为关机信息
  • 示例:
    $ shutdown -r now // 立即重启
    $ shutdown -h 10  // 10分钟后关机
    

reboot

  • 用法:reboot
  • 重启电脑

别名 alias

  • 用法:alias [<name>[=<cmd>]]
  • 为命令cmd添加别名name
  • 当命令中包含空格时,需用引号包裹
  • 无参数时,列出所有已设置的别名及其对应的命令
  • 参数仅包括name而无=<cmd>时,列出该别名对应的命令,若未设置则无输出
  • 该命令设置的别名仅针对当前会话有效,若需长期生效,需将命令写入.profile.bashrc等 dotfiles 中,见进阶内容-dotfiles
  • 示例:
    $ ll                         // 尚未添加别名
    bash: ll: command not found  // 报错:未找到命令
    $ alias ll                   // 列出 "ll" 对应的命令。未设置,无输出
    $ alias ll="ls -alh"         // 为命令 "ls -alh" 添加别名 "ll"
    $ ll                         // 等价于执行 "ls -alh",即列出目录文件 "ls",且包含参数 "-a" "-l" "-h",参考本章 ls 一节
    ...