Linux 基础学习笔记(一):用户、目录、文件操作、管道与重定向
Linux基础学习
本文记录 Linux 入门阶段学习到的基础知识。
主要内容包括:
Linux 用户、命令提示符、目录和路径、文件查看、文件创建、复制、移动、删除、管道、重定向以及部分 Shell 快捷操作。
这部分内容看起来比较基础,但实际上是后面学习 Linux 运维、服务器、Docker、Kubernetes 的地基。
一、认识 Linux 中的用户
Linux 是一个多用户操作系统。
也就是说,一台 Linux 系统可以存在多个用户,不同用户拥有不同的权限。
目前最需要认识两类:
root 用户
普通用户
1. root 用户
root 是 Linux 中的超级用户(Superuser)。
可以简单理解为:
Linux 系统的最高管理员
例如:
[root@localhost ~]#
这里可以拆开来看:
root 当前登录用户
localhost 当前主机名
~ 当前用户所在的家目录
# 通常表示当前是超级用户
root 拥有非常高的系统权限,例如以后可以:
创建和删除用户
安装软件
修改系统配置
启动和关闭服务
修改其他用户没有权限修改的文件
删除系统文件
因此 root 权限虽然方便,但同时也意味着:
操作错误时,造成的影响也可能更大。
所以以后真正使用 Linux 时,不应该形成“什么事情都用 root 做”的习惯。
2. 普通用户
例如系统中存在一个普通用户:
zsan
登录后可能看到:
[zsan@localhost ~]$
和 root 最大的直观区别之一就是最后一个符号:
root 用户 #
普通用户 $
不过需要注意:
#和$是常见提示符,并不应该作为唯一的身份判断依据。
真正想确认当前用户是谁,可以使用:
whoami
例如:
[root@localhost ~]# whoami
root
二、Linux 命令提示符怎么看
Linux 终端中经常看到:
[root@localhost ~]#
可以先按照下面的结构理解:
[当前用户@主机名 当前目录]提示符
例如:
[root@localhost ~]#
表示:
当前用户:root
主机名:localhost
当前位置:~
当前身份:超级用户
再例如:
[zsan@localhost /etc]$
表示:
当前用户:zsan
主机名:localhost
当前位置:/etc
当前身份:普通用户
理解命令提示符以后,以后登录服务器时就能快速知道:
我是谁?
我现在在哪里?
我正在操作哪台机器?
这三个问题对 Linux 运维非常重要。
三、Linux 用户的家目录
Linux 用户通常都有自己的家目录(Home Directory)。
1. 普通用户的家目录
普通用户通常位于:
/home/用户名
例如用户:
zsan
那么他的家目录通常是:
/home/zsan
2. root 的家目录
root 用户比较特殊。
它的家目录通常是:
/root
这里非常容易混淆:
/
和:
/root
不是一个东西。
其中:
/
表示整个 Linux 文件系统的:
根目录 Root Directory
而:
/root
表示:
root 用户的家目录
3. ~ 是什么
在 Linux 中:
~
通常表示:
当前用户的家目录
例如 root:
~ = /root
普通用户 zsan:
~ = /home/zsan
所以如果看到:
[root@localhost ~]#
实际上 root 当前位于:
/root
四、切换用户:su
如果当前是 root:
[root@localhost ~]#
想切换到普通用户 zsan,可以:
su - zsan
切换后:
[zsan@localhost ~]$
这里建议使用:
su - 用户名
而不是简单使用:
su 用户名
现在可以先理解成:
加上
-后,会更加完整地进入目标用户的登录环境。
具体涉及环境变量的区别,可以以后学习 Shell 时再深入。
exit:退出当前 Shell
例如:
[root@localhost ~]# su - zsan
[zsan@localhost ~]$ exit
[root@localhost ~]#
这里:
exit
准确地说是:
退出当前这一层 Shell。
因为前面是从 root 切换到了 zsan,所以退出 zsan 后又回到了上一层 root。
因此不要简单死记:
exit = 返回 root
更准确应该是:
exit = 退出当前 Shell
五、创建用户:useradd
Linux 中可以使用:
useradd
创建用户。
例如:
useradd lisi
创建一个:
lisi
用户。
课堂中可以通过:
cd /home
ls
看到:
lisi
zsan
不过以后更推荐使用:
id lisi
确认用户是否已经存在。
例如:
useradd lisi
id lisi
这里开始需要培养一个运维习惯:
执行命令
↓
检查结果
↓
确认是否符合预期
而不是:
输入命令
↓
没有报错
↓
默认成功
六、pwd:查看当前目录
pwd 是非常基础但非常重要的 Linux 命令。
英文:
Print Working Directory
作用:
显示当前工作目录
例如:
[root@localhost rpm-gpg]# pwd
/etc/pki/rpm-gpg
说明当前位于:
/etc/pki/rpm-gpg
为什么 pwd 很重要?
因为 Linux 中很多操作都和当前目录有关。
例如:
rm -rf *
到底会删除什么东西,很大程度上取决于:
你当前到底在哪个目录
因此以后特别是在执行删除、移动等操作之前,可以养成:
pwd
ls
的习惯。
先确认:
我在哪里?
这里有什么?
然后再操作。
七、ls:查看目录内容
ls 用于:
列出目录中的内容
例如:
[root@localhost ~]# ls
公共 视频 文档 音乐 anaconda-ks.cfg
模板 图片 下载 桌面
如果不指定路径:
ls
通常查看当前目录。
也可以查看指定位置:
ls /etc
建议现在额外认识两个选项
ls -l
ls -l
显示更详细的信息。
以后可以通过它查看:
文件类型
文件权限
所有者
所属组
文件大小
时间
文件名
目前不用一次全部看懂,后面学习权限时会详细讲。
ls -a
ls -a
显示包括隐藏文件在内的内容。
Linux 中很多:
.开头
的文件默认不会被普通 ls 显示。
例如:
.bashrc
常见组合
ls -la
以后非常常用。
八、Linux 文件颜色
课堂环境中可能看到:
蓝色 目录
普通颜色 普通文件
青色 类似快捷方式的文件
这里需要特别注意:
Linux 文件颜色不是绝对标准。
颜色受到:
Linux 发行版
终端主题
ls 配置
LS_COLORS
等影响。
所以以后不要只根据颜色判断文件类型。
课堂上所谓的:
快捷方式
在 Linux 中更准确的名字通常是:
Symbolic Link
符号链接
Symlink
它和 Windows 快捷方式有一些相似之处,但不是完全相同的东西。
以后学习 Linux 文件类型时再详细理解。
九、cd:切换目录
cd:
Change Directory
作用:
切换当前工作目录
例如:
cd /etc/pki/rpm-gpg
执行后:
pwd
可能显示:
/etc/pki/rpm-gpg
十、. 与 ..
这里是初学 Linux 很容易记错的地方。
. 当前目录
.. 父目录
注意:
..本身不是命令。
例如:
cd ..
这里:
cd 命令
.. 路径
意思是:
切换到当前目录的父目录
返回上两层
cd ../..
例如当前:
/etc/pki/rpm-gpg
执行:
cd ../..
路径变化:
/etc/pki/rpm-gpg
↓
/etc/pki
↓
/etc
所以最终到:
/etc
返回上三层
cd ../../..
最终可以来到:
/
十一、为什么 cd .. .. 不行?
如果输入:
cd .. ..
可能得到:
bash: cd: 参数太多
原因是:
..
..
被 Shell 当成了两个独立参数。
而:
../..
属于一个完整的路径。
所以正确:
cd ../..
而不是:
cd .. ..
十二、Linux 目录不是只有“父子关系”
课堂为了方便理解可能会说:
父目录
子目录
但 Linux 的目录实际上是一棵:
树形结构
例如:
/etc/pki/rpm-gpg
可以画成:
/
└── etc
└── pki
└── rpm-gpg
所以 Linux 目录完全可以存在很多层。
十三、绝对路径 Absolute Path
绝对路径的特点:
从 / 开始
例如:
/etc/passwd
/home/zsan
/opt/test.txt
因为它已经完整描述了目标位置,所以:
无论当前在哪里,这个路径指向的位置都不会改变。
例如:
cat /etc/passwd
不管当前位于:
/root
/home
/opt
/tmp
都指向同一个:
/etc/passwd
十四、相对路径 Relative Path
相对路径则依赖:
当前工作目录
例如当前:
/opt
执行:
mkdir aa
因为:
aa
不是以 / 开头,所以它会以当前:
/opt
为参照。
最终创建:
/opt/aa
一个简单判断方法
看到路径时先问:
是不是以 / 开头?
例如:
/etc/passwd
绝对路径。
etc/passwd
相对路径。
十五、cat:查看文本文件
cat 可以用于:
直接查看文本内容
例如:
cat /etc/redhat-release
课堂环境中输出类似:
Rocky Linux release 8.6 (Green Obsidian)
也可以:
cat /etc/passwd
查看用户相关基础信息。
cat -n:显示行号
cat -n /etc/passwd
输出类似:
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
...
其中:
-n
表示:
显示行号
cat 适合什么?
适合:
短文本
小配置文件
快速看内容
如果一个文件有几千行:
cat huge.log
会疯狂刷屏。
这种情况下更加适合:
less huge.log
十六、/etc/passwd 是什么?
课堂中大量使用:
/etc/passwd
作为练习文件。
当前阶段可以先理解:
/etc/passwd保存 Linux 本机用户账户的基础信息。
例如:
root:x:0:0:root:/root:/bin/bash
现在不需要立刻把:
UID
GID
Shell
Home Directory
等所有字段全部背下来。
等以后正式学习:
用户
用户组
权限
时再拆。
十七、wc -l:统计行数
例如:
wc -l /etc/passwd
输出:
45 /etc/passwd
表示:
/etc/passwd 一共有 45 行
当前可以先记:
wc -l 文件
作用:
统计文件行数
十八、less:分页查看文本
less 适合:
阅读比较长的文本
例如:
less /etc/passwd
进入后可以:
↑ / ↓ 上下移动
q 退出
另外建议提前知道:
/关键词
可以搜索内容。
例如:
/root
然后:
n
可以继续寻找下一个匹配结果。
以后看:
日志
配置文件
命令帮助
都非常有用。
十九、mkdir:创建目录
mkdir:
Make Directory
作用:
创建目录
例如:
mkdir aa
如果当前目录是:
/opt
那么最终创建:
/opt/aa
使用绝对路径
mkdir /opt/dd
直接创建:
/opt/dd
mkdir -p
如果需要一次创建:
11/22/33/44
可以:
mkdir -p 11/22/33/44
最终:
11
└── 22
└── 33
└── 44
其中:
-p
可以先理解为:
中间的父目录不存在时,一起创建。
二十、touch:创建文件?
课堂中通常使用:
touch 1.txt
来创建空文件。
例如:
touch 1.txt
touch 2.txt
然后:
ls
可以看到文件。
touch 更准确的理解
虽然入门阶段经常说:
touch = 创建空文件
但这并不完整。
更准确:
touch的主要作用是修改文件时间戳。
如果文件不存在:
touch test.txt
通常会创建文件。
如果文件已经存在:
touch test.txt
通常不会清空原内容。
而是更新时间信息。
这个细节以后工作时很重要。
二十一、cp:复制文件
cp:
Copy
作用:
复制
基本格式:
cp 源 目标
最大的特点:
复制完成后,源数据通常仍然存在。
示例 1:复制到其他目录
cp 1.txt /xyz/
执行后:
原来的 1.txt 还存在
/xyz/ 中多了一份 1.txt
示例 2:复制同时改名
cp 2.txt /xyz/22.txt
表示:
把 2.txt 复制到 /xyz/
并将副本命名为 22.txt
示例 3:当前目录复制并改名
cp 3.txt 333.txt
最终:
3.txt
333.txt
都存在。
二十二、cp -r:复制目录
普通:
cp
主要用于文件。
如果要复制目录:
cp -r aa /xyz/
这里:
-r
来自:
Recursive
中文:
递归
可以理解成:
不只复制目录本身,还继续处理目录里面的文件和子目录。
二十三、mv:移动与重命名
mv:
Move
基本格式:
mv 源 目标
示例 1:移动文件
mv 1.txt /xyz/
执行以后:
原位置不再有 1.txt
/xyz/ 出现 1.txt
示例 2:移动同时改名
mv 2.txt /xyz/b.txt
表示:
移动到 /xyz/
同时改名为 b.txt
示例 3:只重命名
mv aa 1a
如果二者处在同一目录:
aa
就被改名为:
1a
所以:
mv不只是移动,也经常用于重命名。
二十四、cp 和 mv 的区别
| 命令 | 作用 | 原位置 |
|---|---|---|
cp |
复制 | 通常仍然保留 |
mv |
移动 / 改名 | 原路径不再保留 |
可以简单记:
cp = 再做一份
mv = 搬过去
二十五、rm:删除
rm:
Remove
作用:
删除文件或目录
删除普通文件:
rm 1.txt
二十六、rm -r:删除目录
例如:
rm -r aa
其中:
-r
表示:
Recursive
递归
也就是:
连同目录内部内容一起处理。
二十七、rm -f
课堂中可能会把:
-f
简单记成:
强制删除
作为入门记忆可以,但更准确一点:
-f = force
主要特点包括:
减少或取消普通交互询问
忽略某些不存在目标的情况
因此:
rm -rf
通常意味着:
递归
+
不进行普通交互确认
风险很高。
二十八、为什么课堂 rm 会询问?
课堂可能出现:
rm:是否删除普通文件 'passwd'?y
但一定要注意:
不代表所有 Linux 上的 rm 默认都会询问。
原因可能涉及:
alias
系统配置
交互选项
文件状态
所以以后不能依赖:
“反正 rm 最后还会问我”
来保护自己。
二十九、rm -rf *
这是一条需要非常谨慎的命令:
rm -rf *
课堂可以暂时理解:
删除当前目录下匹配到的内容
但技术上还有一个重要细节。
这里:
*
不是 rm 自己解释的。
而是 Shell 先把:
*
展开成当前目录匹配到的文件名和目录名。
然后再交给:
rm
* 通常不会匹配隐藏文件
例如:
.hidden
这种:
.
开头的文件,普通:
*
通常不会匹配。
所以:
rm -rf *
不能非常绝对地理解成:
删除目录内所有一切
真正最大的风险是什么?
不是命令本身。
而是:
当前目录搞错
所以以后执行这种危险操作之前:
pwd
ls
先确认:
我在哪?
这里有什么?
我要删除的是不是这些东西?
这是非常重要的 Linux 运维习惯。
三十、head:查看文件开头
head 用于:
查看文件前面的内容
如果:
head /etc/passwd
默认显示:
前 10 行
指定前 5 行:
head -n 5 /etc/passwd
课堂中也可能写:
head -5 /etc/passwd
在 GNU/Linux 中通常可以使用。
但笔记和工作脚本中:
head -n 5
可读性更好。
三十一、tail:查看文件结尾
tail 和 head 相反。
用于:
查看文件最后部分
默认:
tail /etc/passwd
查看:
最后 10 行
指定:
tail -n 5 /etc/passwd
查看最后 5 行。
三十二、tail -f:以后看日志非常重要
虽然现在刚入门,但可以提前认识:
tail -f 日志文件
它可以:
持续查看文件新增加的内容。
以后运行:
Nginx
MySQL
Docker
各种 Linux 服务
时,经常需要实时观察日志。
因此:
tail -f
以后会非常常见。
三十三、echo:输出内容
echo 用于:
在终端中输出文本或变量
例如:
echo 123
输出:
123
以后还可以:
echo $HOME
查看变量值。
当前可以先把:
echo
理解成:
产生一段输出。
这样更容易理解后面的:
>
>>
|
三十四、标准输入和标准输出
为了理解管道和重定向,现在需要提前认识两个词。
Standard Input
标准输入
stdin
和:
Standard Output
标准输出
stdout
可以先想象:
数据
↓
命令
↓
结果
其中:
stdin 数据从哪里进来
stdout 正常结果往哪里出去
以后还会学习:
stderr
Standard Error
标准错误
现在不用急。
三十五、>:覆盖重定向
正常:
echo 123
结果显示在终端。
如果:
echo 123 > /opt/2.txt
数据流就变成:
echo
↓
123
↓
>
↓
/opt/2.txt
也就是说:
不再把正常输出显示到终端,而是写进文件。
文件不存在
例如:
echo 123 > /opt/2.txt
如果:
2.txt
不存在,通常会创建。
文件已经存在
例如:
echo 123 > test.txt
然后:
echo 789 > test.txt
最终:
cat test.txt
得到:
789
原来的:
123
被覆盖。
所以:
> = 覆盖
必须记住。
三十六、>>:追加重定向
如果:
echo 789 > test.txt
文件里面:
789
然后:
echo 123 >> test.txt
再:
cat test.txt
得到:
789
123
所以:
>> = 追加
三十七、> 和 >> 的区别
这是 Linux 中非常重要的区别:
> 覆盖
>> 追加
以后如果想:
追加一行配置
结果不小心用了:
>
可能直接把原文件清空并覆盖。
所以这不只是考试知识,而是实际操作风险。
三十八、管道 |
管道符:
|
是 Linux Shell 中非常重要的东西。
可以先看:
命令1 | 命令2
它的核心作用:
把前一个命令的标准输出 stdout,连接到后一个命令的标准输入 stdin。
也就是:
命令1
↓
stdout
↓
|
↓
stdin
↓
命令2
三十九、为什么不能简单理解成“输出变成参数”
课堂为了入门可能会说:
前一个命令的结果作为后一个命令的参数
这样容易理解,但严格来说不准确。
管道真正传递的是:
数据流
也就是:
Standard Output
↓
Standard Input
而不是简单地拼接成命令行参数。
这个区别以后学习:
grep
awk
sed
日志分析
Docker
Kubernetes
会越来越重要。
四十、拆解一条课堂管道命令
例如:
head -n 12 /etc/passwd | cat -n | tail -n 1
不要当成一个整体死记。
一步一步看。
第一步
head -n 12 /etc/passwd
得到:
/etc/passwd 前 12 行
第二步
|
把这 12 行传给:
cat -n
第三步
cat -n
给收到的数据增加行号。
第四步
再次:
|
把结果传给:
tail -n 1
第五步
tail -n 1
只保留最后一行。
最终就相当于取得:
第 12 行
四十一、管道和重定向有什么区别?
管道:
命令1 | 命令2
可以理解:
命令
↓
命令
重定向:
命令 > 文件
可以理解:
命令
↓
文件
还可以组合
例如:
head -n 12 /etc/passwd | tail -n 1 > result.txt
数据流:
/etc/passwd
↓
head
↓
tail
↓
result.txt
这也是 Linux Shell 非常强大的地方:
很多小工具可以通过管道组合起来完成复杂操作。
四十二、Alt + . / Esc + .
课堂还学习了一个比较实用的 Shell 快捷操作:
Alt + .
或者某些环境:
Esc
再按 .
作用:
插入上一条命令的最后一个参数。
例如刚执行:
head /etc/passwd
下一条输入:
cat
然后按:
Alt + .
可能自动变成:
cat /etc/passwd
适合重复使用很长的路径。
四十三、!命令
例如之前执行过:
head /etc/passwd
后面输入:
!head
Bash 可以找到最近一条:
以 head 开头
的历史命令并再次执行。
注意历史命令的风险
例如:
!rm
如果自己已经忘记最近执行过哪条:
rm ...
就存在风险。
所以生产环境里:
不确定展开的历史命令是什么,就不要盲目执行。
目前使用:
↑
↓
查看历史命令会更加直观。
四十四、终端快捷键不等于 Linux 命令
课堂还记录:
Ctrl + 左 / 右
用于终端分屏。
以及:
Ctrl + Shift + +
Ctrl + -
用于调整字体。
这里需要特别区分:
这些通常属于终端软件本身的快捷键。
并不是:
Linux 内核
统一规定的操作。
以后换成:
VMware Console
Windows Terminal
Xshell
MobaXterm
SSH Client
快捷键可能不同。
所以以后做笔记时,可以分成:
Linux 命令
Shell 操作
终端软件快捷键
三类。
四十五、Linux 初学阶段应该形成什么习惯?
现在真正重要的,并不是一次背下:
几十条命令
几十个参数
而是形成一个操作流程。
以后执行 Linux 操作之前先问:
我是谁?
我在哪?
这里有什么?
我要操作谁?
我要让它发生什么变化?
执行以后怎么验证?
对应现在已经会的命令:
whoami
pwd
ls
然后再使用:
mkdir
touch
cp
mv
rm
最后继续:
ls
cat
pwd
检查。
四十六、一个完整练习
建议自己在虚拟机建立实验目录:
mkdir -p ~/linux-lab/day01
进入:
cd ~/linux-lab/day01
确认:
pwd
创建文件:
touch a.txt
写第一行:
echo Linux > a.txt
追加第二行:
echo Infrastructure >> a.txt
查看:
cat -n a.txt
应该类似:
1 Linux
2 Infrastructure
复制:
cp a.txt b.txt
验证:
ls
cat b.txt
建立目录:
mkdir docs
移动并改名:
mv b.txt docs/note.txt
验证:
ls docs
cat docs/note.txt
最后删除测试文件之前:
pwd
ls
确认以后:
rm docs/note.txt
再:
ls docs
确认结果。
这样一个小实验,就能把:
pwd
ls
cd
mkdir
touch
echo
>
>>
cat
cp
mv
rm
基本串起来。
四十七、常见报错应该怎么看?
初学 Linux 时看到英文报错,不要直接慌,也不要第一反应就是:
换一个命令试试
先读报错。
No such file or directory
意思大致是:
没有这个文件或目录
先检查:
pwd
ls
可能原因:
路径写错
当前位置不对
文件不存在
文件名大小写错误
Permission denied
意思:
权限不足
先:
whoami
确认当前用户。
以后学习权限以后,再结合:
ls -l
继续判断。
Is a directory
可能说明:
你把目录当成普通文件处理了
以后可以先:
ls -l
查看目标类型。
Directory not empty
表示:
目录里面还有内容
不要看到这个以后第一反应直接:
rm -rf
应该先:
ls 目录名
看清楚里面到底有什么。
四十八、本阶段最容易混淆的知识
| 容易混淆 | 正确理解 |
|---|---|
/ 和 /root |
/ 是根目录,/root 是 root 家目录 |
. 和 .. |
. 当前目录,.. 父目录 |
.. 是命令 |
错,cd 才是命令 |
cp 和 mv |
cp 复制,mv 移动/改名 |
> 和 >> |
> 覆盖,>> 追加 |
| ` | 和>` |
cat 和 less |
短文件可 cat,长文件更适合 less |
head 和 tail |
head 看开头,tail 看结尾 |
touch |
不只是创建文件,本质还涉及时间戳 |
rm -rf * |
高风险,且 * 通常不包含隐藏文件 |
| 文件颜色 | 只是当前终端/ls 配置,不是绝对标准 |
四十九、Linux 基础命令速查
| 命令 | 作用 |
|---|---|
whoami |
查看当前用户 |
pwd |
查看当前工作目录 |
ls |
查看目录内容 |
cd |
切换目录 |
mkdir |
创建目录 |
touch |
创建测试文件 / 修改时间戳 |
cat |
直接查看文本 |
less |
分页查看文本 |
head |
查看文件开头 |
tail |
查看文件结尾 |
wc -l |
统计文件行数 |
cp |
复制 |
mv |
移动 / 重命名 |
rm |
删除 |
echo |
输出文本或变量 |
| ` | ` |
> |
覆盖重定向 |
>> |
追加重定向 |
su - |
切换用户 |
exit |
退出当前 Shell |
useradd |
创建用户 |
知道自己是谁
知道自己在哪
能在目录之间移动
能创建文件和目录
能复制、移动、删除
能查看文本
理解绝对路径和相对路径
理解管道的数据流
理解 > 和 >> 的区别
危险操作前会确认当前位置
操作以后会验证结果
总结
这一阶段学习的 Linux 命令虽然很多,但本质上可以总结成一条逻辑:
whoami
↓
我是谁?
pwd
↓
我在哪?
ls
↓
这里有什么?
cd
↓
我要去哪?
cat / less / head / tail
↓
我要看什么?
mkdir / touch
↓
我要创建什么?
cp / mv / rm
↓
我要改变什么?
|
↓
我要把输出交给谁继续处理?
> / >>
↓
我要把输出写到哪里?
最后:
↓
验证结果
问题 → 原因 → 如何检查 → 如何验证 → 如何解决