Lazy loaded image
🐚Linux与shell命令
字数 2854阅读时长 8 分钟
2026-5-16
2026-5-25
By BarryZed

权限

文件属性

  • 第一个字符,文件类型:
    • d :目录
    • - :普通文件
    • l :快捷方式,指向其他文件
    • bc :外围设备
    • sp :数据结构与管道
  • 文件名以. 开头表示为隐藏文件

修改权限

  • chmod
chmod <n1n2n3> <File Name>
r
4
w
2
x
1
-
0
chmod <who><+/-/=><permission> <File Name>
who :u、g、o、a(all)
  • chown
chown [owner]:[owner_group] <File Name>
  • 权限掩码(umask)
创建文件时在预设权限中减掉umask值对应的权限
默认umask
  • root:022
  • 普通用户:002
umask 修改的是当前用户的umask,且不改变夏梓桐文件,是临时设置,重启后恢复默认
  • 特殊权限位
    • SUID
      • 执行文件时,临时变成“文件所有者”身份运行
        s 出现在 user 的 x 位(-rwsr-xr-x)
        使用chmod 时在三位数字前加 4chmod 4755 file
    • SGID
      • 对文件:执行时使用“文件所属组权限”
        对目录:新建文件自动继承目录的组
        s 出现在group的 x 位(-rwxr-sr-x)
        使用chmod 时在三位数字前加 2chmod 2755 file
    • SBIT
      • 只对目录有效:该目录中的文件只能被文件所有者和root删除
        t 出现在other的第x位(drwxrwxrwt
        使用chmod 时在三位数字前加 1chmod 1755 file

常用命令

ls

-a :列出目录下的所有文件,包括以.开头的隐含文件; -l :列出文件的详细信息; -k:以k字节的形式表示文件的大小; -t:以时间排序

cat

-n: 由 1 开始对所有输出的行数编号
-b: 和 -n 相似 ,只不过对于空白行不编号。
-s: 当遇到有连续两行以上的空白行 ,就代换为一行的空白行
cat file2 file1>file3 :把file 1和file 2文件的内容合并为file 3

head

显示文件前10行
-n num: 显示指定文件的前num行
-c num: 显示指定文件的前num个字符。
-num: 从倒数第num行开始显示指定文件的内容

more/less

分屏显示文件内容

硬链接

多个名字指向同一个文件实体
= 多个文件名,1个inode
只有把一个inode的全部硬链接删除,文件才真正消失
ln file1 file2

符号链接

一个文件指向另一个文件的“路径”
类似快捷方式
ls 中有->
ln -s file1 link1

文件压缩与归档

gzip

生成.gz 文件

bzip2

生成.bz2 文件

xz

生成.xz 文件

tar

-c:创建新的文件。如果用户想备份一个目录或一些文件,就要选择这个选项。
-f:指定备份文件名。
-t:列出备份文件的内容,查看已经备份的文件。
-x:从备份文件中还原文件。
-v:显示指令执行过程。
-r:添加文件到归档包文件的尾部
-C:解压到指定的目录dir
-z:用gzip来压缩/解压缩文件,加上该选项后可以将文件进行压缩,但还原时也要用该选项进行解压缩。

Vi编辑器

按键
作用
i
在光标前插入
a
在光标后插入
o
下一行插入新行
I
行首插入
A
行尾插入

移动光标

按键
作用
h
l
j
k
数字+空格
右移n个字符
数字+回车
下移n行
0
移到行首
$
移到行尾
gg
移到开头
数字+G
移到第n行
G
移到尾行

删除

按键
作用
例子
x
后删[del]
X
前删[Backspace]
dd
删除整行
数字+dd
向下删除n行
d+范围
选中删除
d1G :删除光标到第一行 d$ :删除光标到本行尾
dw
删除一个单词

复制/粘贴

按键
作用
yy
复制一行
数字+yy
向下复制n行
y+范围
选中复制
p
粘贴到下一行
P
粘贴到上一行

撤销

按键
作用
u
撤销
Ctrl + r
重做
命令
作用
:w
保存
:q
退出
:wq
保存并退出
:q!
强制退出不保存
ZZ
=:wq
set nu
显示行号
set nonu
隐藏行号

搜索

向下搜索 hello
向上搜索
替换(substitute)
范围:
  • 1,$ :第一行到最后一行
  • 100, 200 :100~200行
  • % :全文
参数:
  • 不写:每行只替换第一个
  • g :一行内所有匹配都替换
  • c :每次替换前确认

静态库(.a)

a:archive
每个程序都有自己的一份库代码,不共享内存
ar :archive
r :replace
c :create
s :symbol index,创建索引

调用

-L :在后面的目录找库,这里是. 所以是当前目录
-lmylib :使用 libmylib.so

动态库(.so)

so:shared object
内核可以把一个库映射到多个进程的内存,节省空间
f :flag(不用管)
PIC :Position Independent Code(位置无关代码)

命名规范

lib + 名字 + .a
使用时:-l名字

Git

初始化:git init

工作区(Working Directory)

正在改的文件
加入缓存区

暂存区(Staging Area)

准备提交的“草稿箱”
提交

仓库(Repository)

正式历史记录(永久存档)
查看历史

Make

Makefile

一般格式
前置条件与命令至少存在一个即可
  • target:本质上是要生成的目标
    • 如果是多个文件 用空格分开
    • 也可以是操作
      • 如果是操作,可在前面加上.PHONY 防止混淆(避免当前目录有同名文件)
  • prerequisites
    • 通常是⼀组⽂件名,之间⽤空格分隔。它指定了“⽬标”是否重新构建的判断标准: 只要⼀个前置⽂件不存在,或者更新过,“⽬标”就需要重新构建。
    • 在执行到这个目标时,先检查前置条件是否存在且为最新,否则生成或重建
  • command
    • 每行命令都是在一个单独的Shell中运行,没有继承关系;
    • 使用; 在同一行写即可继承
    • 使用;\ 换行也可继承
    • 在文件开头写.ONESHELL: ,即可让整个命令块在同一个Shell中执行
一整套target + prerequisites + command 是一个规则

变量系统

本质上来说是把所有“变量”在当前命令执行前替换/字符串展开
有局部变量和全局变量
  • 定义
    • 使用
      • 自动变量(automatic variable)
        • $@ :target
        • $< :第一个前置条件
        • $^ :全部前置条件
        • $? :所有比target时间戳新的前置条件

      通配符

      *

      任意长度

      一个字符

      [...]

      字符集合

      用户与群组管理

      UID

      0:root
      1~999:系统用户
      1000~:普通用户
      在 Linux 系统中,创建用户账户时通常会自动创建一个与用户名相同的主组,该组作为用户的主群组使用。

      /etc/passwd

      在Linux系统中,所创建的用户账户及其相关信息(密码除外)
      内容格式:用户名:加密口令:UID:GID:用户的描述信息:主目录:命令解释器(登录shell)
      所有用户都有读权限

      /etc/shadow

      经过加密后的密码,只对root可读
      内容格式:
      字段
      含义
      1
      用户名(username)
      2
      加密后的密码(password hash),* 表示非登录用户,!! 表示没有设置密码
      3
      上次修改密码的时间(last password change)
      4
      最小使用天数(min days)
      5
      最大使用天数(max days)
      6
      密码过期前警告天数(warn days)
      7
      过期后还能用多久(inactive days)
      8
      账户过期时间(expire date)
      9
      保留字段(reserved)

      用户账户管理

      新建用户

      useradd [] <username>
      -d :指定主目录
      -f inactive_days :过期多久后停用,若为-1 则不会停用

      修改口令

      passwd [选项] [username]
      root直接passwd 即可修改root密码

      进程

      ps

      查看进程
      -e :全部进程
      -f :完全显示

      nice

      nice值越高,优先级越低
      在进程开始时修改
      只有 root 才有权限提高一个进程的优先权,即降低nice值。
      renice :运行中修改进程nice值

      Shell

      Shell变量

      调用:${name}$name
      双引号内的可以调用,单引号内的完全原样输出
      赋值:不能有空格(name=BarryZed
      可以累加(PATH="$PATH":/home/bin
      read [] name
      -p :prompt
      -t :wait time
      设为环境变量:export PATH
      取消变量:unset PATH

      命令的别名

      alias 别名='指令 选项'
      取消别名:unalias 别名

      输入输出重定向

      > :擦除重写
      >> :接着写
      2> :擦出重写错误结果
      2>> :接着写错误结果
      < :从单个文件输入
      << :从当前shell输入多行(从EOFEOF

      多命令间的逻辑关系

      cmd1 && cmd2 :1正确,则执行2
      cmd1 || cmd2 :1错误,则执行2
      $? :保存“上一个命令”的退出状态(exit status)(0为成功)

      管道命令

      cut

      cut -d ":" -f 1,3,7 /etc/passwd :指定分隔符(delimiter),取第1、3、7列(field)

      grep

      grep "hello" test.txt :找出所有包含 hello 的行(输出整行)
      -i :忽略大小写
      -n :输出行和行号
      -v :输出补集

      sort

      -b :忽略前导空格
      -n :按数值大小
      -u :去重
      -r :逆序
      -t :分割栏位字符,-k 栏数

      正则表达式

      ^ :匹配行首
      $ :匹配行尾
      [^] :匹配[^字符]之外的任意一个字符
      \{n,m\}:匹配连续n到m个前一个字符
      a{n,m} :a至少出现n次,至多出现m次
      [0-9]{3,5} :3-5位数
      b{n} :b出现n次
      [:alnum:] 匹配任意一个字母或数字字符 [:alpha:] 匹配任意一个字母字符(包括大小写字母) [:blank:] 空格与制表符(横向和纵向) [:digit:] 匹配任意一个数字字符 [:lower:] 匹配小写字母 [:upper:] 匹配大写字母 [:punct:] 匹配标点符号 [:space:] 匹配一个包括换行符、回车等在内的所有空白符 [:graph:] 匹配任何一个可以看得见的且可以打印的字符(不包括空格) [:xdigit:]任何一个十六进制数(即:0-9,a-f,A-F) [:cntrl:] 任何一个控制字符(ASCII字符集中的前32个字符) [:print:] 任何一个可以打印的字符
      上一篇
      数据库系统原理
      下一篇
      Java

      评论
      Loading...