Sakura Cactus
← 返回文章

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
↓
我要改变什么?

|
↓
我要把输出交给谁继续处理?

> / >>
↓
我要把输出写到哪里?

最后:
↓
验证结果

问题 → 原因 → 如何检查 → 如何验证 → 如何解决