
在进入指令的学习前,我们先来简单的聊一聊指令
一、浅谈指令
1、作为一个才接触Linux不久的萌新,我想问你是怎么看待指令的?
可以思考一会,下面我会用vim编辑器写一个简单的c语言代码
[xzx@instance-157t533k 9_8]$ cat test.c
#include<stdio.h>
int main()
{
printf("hello Linux");
return 0;
}
我们可以通过gcc将代码编译,得到一个可执行文件a.out
[xzx@instance-157t533k 9_8]$ gcc test.c
[xzx@instance-157t533k 9_8]$ ll
total 16
-rwxrwxr-x 1 xzx xzx 8440 Sep 8 12:45 a.out
-rw-rw-r-- 1 xzx xzx 75 Sep 8 12:44 test.c
然后通过./a.out执行这个可执行文件
[xzx@instance-157t533k 9_8]$ ./a.out
hello Linux[xzx@instance-157t533k 9_8]$
可以看到执行了我们刚才写的c语言代码(看着比较怪忘记打\n换行了),那么通过这个演示我们能否发现指令和可执行程序有什么区别?
没有区别,指令就是可执行程序
2、操作系统在执行指令之前,应该先做什么呢?
[xzx@instance-157t533k 9_8]$ ahdfhalkdf
-bash: ahdfhalkdf: command not found
在我脸滚键盘乱输一通后,给我提示了命令没有找到。由这句话我们可以推断出操作系统在执行指令之前,会在系统中查找是否存在对应的指令 ,因此我们又能推断出指令一定是在系统的某个地方存在的!
结合前两个问题,新的问题出现了,指令到底在哪里呢?
3、指令在哪里?
[xzx@instance-157t533k 9_8]$ su -
Password:
Last login: Mon Sep 8 13:01:30 CST 2025 on pts/0
Last failed login: Mon Sep 8 13:03:29 CST 2025 from 103.152.76.107 on ssh:notty
There were 23 failed login attempts since the last successful login.
[root@instance-157t533k ~]# cd ..
[root@instance-157t533k /]# ll
total 68
lrwxrwxrwx. 1 root root 7 Jan 26 2021 bin -> usr/bin
dr-xr-xr-x. 5 root root 4096 Dec 5 2023 boot
drwxr-xr-x 20 root root 3140 Aug 20 16:33 dev
drwxr-xr-x. 94 root root 12288 Sep 2 21:27 etc
drwxr-xr-x. 3 root root 4096 Aug 29 19:42 home
lrwxrwxrwx. 1 root root 7 Jan 26 2021 lib -> usr/lib
lrwxrwxrwx. 1 root root 9 Jan 26 2021 lib64 -> usr/lib64
drwx------. 2 root root 16384 Jan 26 2021 lost+found
drwxr-xr-x. 2 root root 4096 Apr 11 2018 media
drwxr-xr-x. 2 root root 4096 Apr 11 2018 mnt
drwxr-xr-x. 9 root root 4096 Aug 20 16:45 opt
dr-xr-xr-x 183 root root 0 Aug 20 16:33 proc
dr-xr-x---. 9 root root 4096 Sep 7 15:33 root
drwxr-xr-x 28 root root 900 Sep 7 15:22 run
lrwxrwxrwx. 1 root root 8 Jan 26 2021 sbin -> usr/sbin
drwxr-xr-x. 2 root root 4096 Apr 11 2018 srv
dr-xr-xr-x 13 root root 0 Sep 5 16:50 sys
drwxrwxrwt. 9 root root 4096 Sep 8 13:04 tmp
drwxr-xr-x. 14 root root 4096 Dec 5 2023 usr
drwxr-xr-x. 21 root root 4096 Dec 5 2023 var
[root@instance-157t533k /]# cd bin
[root@instance-157t533k bin]# ll
total 489940
-rwxr-xr-x. 1 root root 41544 Oct 31 2018 [
-rwxr-xr-x. 1 root root 107904 Oct 31 2018 a2p
-rwxr-xr-x. 1 root root 11336 Nov 14 2018 abrt-action-analyze-backtrace
-rwxr-xr-x. 1 root root 11320 Nov 14 2018 abrt-action-analyze-c
-rwxr-xr-x. 1 root root 1345 Nov 14 2018 abrt-action-analyze-ccpp-local
-rwxr-xr-x. 1 root root 6821 Nov 14 2018 abrt-action-analyze-core
-rwxr-xr-x. 1 root root 11304 Nov 14 2018 abrt-action-analyze-oops
-rwxr-xr-x. 1 root root 11312 Nov 14 2018 abrt-action-analyze-python
-rwxr-xr-x. 1 root root 2814 Nov 14 2018 abrt-action-analyze-vmcore
-rwxr-xr-x. 1 root root 1348 Nov 14 2018 abrt-action-analyze-vulnerability
-rwxr-xr-x. 1 root root 11360 Nov 14 2018 abrt-action-analyze-xorg
-rwxr-xr-x. 1 root root 5002 Nov 14 2018 abrt-action-check-oops-for-hw-error
-rwxr-xr-x. 1 root root 11344 Nov 14 2018 abrt-action-generate-backtrace
-rwxr-xr-x. 1 root root 11328 Nov 14 2018 abrt-action-generate-core-backtrace
-rwxr-xr-x. 1 root root 8341 Nov 14 2018 abrt-action-install-debuginfo
-rwxr-xr-x. 1 root root 3207 Nov 14 2018 abrt-action-list-dsos
-rwxr-xr-x. 1 root root 8958 Nov 14 2018 abrt-action-notify
通过su -切换为root账号(su -后面会详细讲解),cd ..回退到根目录,通过ll能看到一个bin->usr/bin的文件,cd 进去,此时在ll我们就能看到大量的指令(这里截取了部分),由此我们能知道root用户下指令存放在/usr/bin路径下
[root@instance-157t533k 8_29_test]# vim test.c
[root@instance-157t533k 8_29_test]# gcc test.c
[root@instance-157t533k 8_29_test]# ll
total 32
-rwxr-xr-x 1 root root 8440 Sep 8 13:21 a.out
drwxr-xr-x 2 root root 4096 Aug 29 14:02 data.txt
drwxr-xr-x 2 root root 4096 Aug 29 14:02 dir2
drwxr-xr-x 2 root root 4096 Aug 29 15:49 dir3
-rw-r--r-- 1 root root 78 Sep 8 13:21 test.c
drwxr-xr-x 2 root root 4096 Aug 29 16:07 test.cpp
[root@instance-157t533k 8_29_test]# mv a.out command_test
[root@instance-157t533k 8_29_test]# ./command_test
hello Linux
[root@instance-157t533k 8_29_test]# command_test
-bash: command_test: command not found
对于我们自己写可执行程序是可以正常执行的,但却不能像指令一样使用
但当我们把我们自己写的command_test引动到/usr/bin路径下,此时指令便可以使用了
[root@instance-157t533k /]# ll
total 84
lrwxrwxrwx. 1 root root 7 Jan 26 2021 bin -> usr/bin
dr-xr-xr-x. 5 root root 4096 Dec 5 2023 boot
-rwxr-xr-x 1 root root 8440 Sep 8 13:38 command_test
[root@instance-157t533k /]# mv command_test ./bin
[root@instance-157t533k /]# ll
total 72
lrwxrwxrwx. 1 root root 7 Jan 26 2021 bin -> usr/bin
dr-xr-xr-x. 5 root root 4096 Dec 5 2023 boot
drwxr-xr-x 20 root root 3140 Aug 20 16:33 dev
[root@instance-157t533k /]# command_test
Hello Linux
所以/usr/bin路径下的指令一定是某种可执行程序C/C++/Python/shell脚本
4、总结
经过上面的几个问题,我们能知道指令是在系统中特定的路径下存在的!
指令的本质就是可执行程序,和我们自己写的代码编译好的程序,没有本质区别(唯一区别就是别人的代码写的比我们好)
5、安装与卸载
**安装:**把可执行程序,拷贝到系统目录下
卸载:把可执行程序,从某条系统路径下删除
二、浅谈Linux、输入重定向和追加重定向
1、Linux下一切皆文件
比如显示器(向显示器打印->fwrite(),fwrite(){}),键盘(从键盘进行读取->fread,fwite(){}),普通文件(fwrite,fread),都具有读写方法
2、回顾输出重定向
[xzx@instance-157t533k 9_8]$ echo Hello Linux
Hello Linux
[xzx@instance-157t533k 9_8]$ echo Hello Linux > out.txt
[xzx@instance-157t533k 9_8]$ cat out.txt
Hello Linux
echo Hello Linux,本来是把Hello Linux写到显示器文件里,如上。
echo Hello Linux > out.txt,在>符号作用下,把本该写入到显示器文件的内容写入到out.txt文件中,这种行为就叫做输出重定向
3、echo、cat、ll的区别
1、echo
echo+ 字符串:输出的结果为字符串,并且向目标文件进行写入的时候,是覆盖写入的(1、先清空文件,2、写入新内容)
[xzx@instance-157t533k 9_8]$ echo Hello word
Hello word
[xzx@instance-157t533k 9_8]$ cat out.txt
Hello Linux
[xzx@instance-157t533k 9_8]$ echo Hello World > out.txt
[xzx@instance-157t533k 9_8]$ cat out.txt
Hello World
2、cat
cat打印的是文件的内容
[xzx@instance-157t533k 9_8]$ cat out.txt
Hello World
3、ll
ll是打印的是文件的属性
[xzx@instance-157t533k 9_8]$ ll
total 4
-rw-rw-r-- 1 xzx xzx 12 Sep 8 14:31 out.txt
4、由输出重定向衍生的文件清空简易操作
echo >+文件名:文件清空简易操作,原理:利用echo输入重定向先清空文件内容,然后写入空白内容
[xzx@instance-157t533k 9_8]$ cat out.txt
Hello World
[xzx@instance-157t533k 9_8]$ echo > out.txt
[xzx@instance-157t533k 9_8]$ cat out.txt
[xzx@instance-157t533k 9_8]$
5、追加重定向
echo 字符串 >> 文件名:打开文件内容不清空,在文件末尾写入新内容,这叫做追加重定向
[xzx@instance-157t533k 9_9]$ touch test.txt
[xzx@instance-157t533k 9_9]$ echo Hello Linux > test.txt
[xzx@instance-157t533k 9_9]$ cat test.txt
Hello Linux
[xzx@instance-157t533k 9_9]$ echo Hello World >> test.txt
[xzx@instance-157t533k 9_9]$ cat test.txt
Hello Linux
Hello World
6、输入重定向
cat+键盘输入:默认从键盘文件读,在显示器打印出来
[xzx@instance-157t533k 9_9]$ cat
hello world
hello world
hello linux
hello linux
^C
[xzx@instance-157t533k 9_9]$
可以通过ctrl+c终止从键盘输入
cat < xxx.txt:本来要从键盘文件读取,现在不用从键盘读取,从指定的文件中读取,这就叫做输入重定向
[xzx@instance-157t533k 9_9]$ cat < test.txt
Hello Linux
Hello World
[xzx@instance-157t533k 9_9]$
7、输出重定向和追加重定向的快捷创建普通文件
无论输出重定向>,还是追加重定向>>,如果写入的目的地文件不存在,会默认创建一个文件,可以不用touch创建文件,通过> 文件名,也能创建文件,只是不写入任何内容
[xzx@instance-157t533k 9_9]$ > data.txt
[xzx@instance-157t533k 9_9]$ ll
total 36
-rw-rw-r-- 1 xzx xzx 0 Sep 9 19:56 data.txt
-rw-rw-r-- 1 xzx xzx 222 Sep 9 11:09 test.c
-rw-rw-r-- 1 xzx xzx 143 Sep 9 10:32 test.cpp
-rw-rw-r-- 1 xzx xzx 16969 Sep 9 11:09 test.i
-rw-rw-r-- 1 xzx xzx 666 Sep 9 11:21 test.s
-rw-rw-r-- 1 xzx xzx 24 Sep 9 19:45 test.txt
[xzx@instance-157t533k 9_9]$ >> data.c
[xzx@instance-157t533k 9_9]$ ll
total 36
-rw-rw-r-- 1 xzx xzx 0 Sep 9 19:57 data.c
-rw-rw-r-- 1 xzx xzx 0 Sep 9 19:56 data.txt
-rw-rw-r-- 1 xzx xzx 222 Sep 9 11:09 test.c
-rw-rw-r-- 1 xzx xzx 143 Sep 9 10:32 test.cpp
-rw-rw-r-- 1 xzx xzx 16969 Sep 9 11:09 test.i
-rw-rw-r-- 1 xzx xzx 666 Sep 9 11:21 test.s
-rw-rw-r-- 1 xzx xzx 24 Sep 9 19:45 test.txt
[xzx@instance-157t533k 9_9]$
三、指令
1、cat指令
语法:cat [选项] [文件]
功能:查看目标文件内容
常用选项:
1、-b:对非空输出行编号
[xzx@instance-157t533k 9_9]$ cat -b test.txt
1 Hello Linux
2 Hello World
3 Hello World
4 Hello World
5 Hello World
6 Hello World
7 Hello Worl
8 Hello World
9 Hello World
10 Hello World
2、-s:输出多行空行
[xzx@instance-157t533k 9_9]$ cat test.txt
Hello Linux
Hello World
Hello World
Hello World
Hello World
Hello World
Hello Worl
Hello World
Hello World
Hello World
[xzx@instance-157t533k 9_9]$ cat -s test.txt
Hello Linux
Hello World
Hello World
Hello World
Hello World
Hello World
Hello Worl
Hello World
Hello World
Hello World
3、-n:对输出的所有行编号
[xzx@instance-157t533k 9_9]$ cat -n test.txt
1 Hello Linux
2 Hello World
3
4
5
6
7 Hello World
8 Hello World
9 Hello World
10 Hello World
11 Hello Worl
12
13
14 Hello World
15 Hello World
16 Hello World
通过对cat的学习,我们可以发现cat的优点和缺点,优点在于看小文本非常方便,缺点则是不适合看大文本
2、more指令
语法:more [选项] [文件]
功能:类似cat,查看目标文件内容
常用选项:
-n:输出n行
[xzx@instance-157t533k 9_9]$ more -10 test.txt
Hello Linux
Hello World
Hello World
Hello World
Hello World
Hello World
[xzx@instance-157t533k 9_9]$ more -16 test.txt
Hello Linux
Hello World
Hello World
Hello World
Hello World
Hello World
Hello Worl
Hello World
Hello World
Hello World
q:退出more
按空格:按下空格键回向下滚动一整页内容
按回车;按回车键会向下滚动一行,用于逐行查看
3、less指令
less工具也是对文件或其它输出进行分页显示的工具,应该说是Linux正统查看文件内容的工具,功能极其强大
less的用法比起more更加有弹性。在使用more的时候,我们并没有办法向前返回看只能往后看
若使用less,就可以使用[PageUp][PageDown]等按键来往前或往后翻看文件,更容易查看一个文件的内容
除此之外,在less里还有搜索功能,不止可以向下搜,也可以向上搜
语法:less [选项] 文件
功能:less和more类似,但使用less可以随意浏览文件,而more仅能向后移动,却不能向前移动,less查看之前不会加载整个文件
常用选项:
1、/字符串:向下搜索字符串
hello world
hello Linux
Hello Linux
Hello World
i love c++
I Love C++
c/c++
C/C++
/c++
i love c++
I Love C++
c/c++
C/C++
2、?字符串:向上搜索字符串
hello world
hello Linux
Hello Linux
Hello World
i love c++
I Love C++
c/c++
C/C++
/linux
hello Linux
Hello Linux
3、-i:忽略搜索时的大小写
hello world
hello Linux
Hello Linux
Hello World
i love c++
I Love C++
c/c++
C/C++
/c++
i love c++
I Love C++
c/c++
C/C++
4、-N:显示每行的行号
1 hello world
2 hello Linux
3 Hello Linux
4 Hello World
5 i love c++
6 I Love C++
7 c/c++
8 C/C++
5、n:重复前一个搜索(与/和?有关)
5 i love c++
6 I Love C++
7 c/c++
8 C/C++
5 i love c++
6 I Love C++
7 c/c++
6、N:反向重复前一个搜索(与/和?有关)
7、q:quit,退出less
什么都属于大文本?我们为什么要看一个比较大的文本?
比如项目、日志、源代码等等这些都属于大文本;分析源代码时,找到main函数,先从main函数开始看起;报错时,分析日志文件等等
4、head指令
head和tail就像它的名字一样浅显易懂,它是用来呈现开头或结尾某个数量行的文字区域
head用来显示文件的到标准输出中(也就是打印在控制台),而tail当然就是看文件的结尾
语法:head [参数] [文件]
功能:head用来显示文件的开头打印到控制台,默认head命令打印相应文件的开头10行
选项:
-n<行数>:显示前n行
[xzx@instance-157t533k 9_9]$ cat test.txt
hello world
hello Linux
Hello Linux
Hello World
i love c++
I Love C++
c/c++
C/C++
[xzx@instance-157t533k 9_9]$ head -4 test.txt
hello world
hello Linux
Hello Linux
Hello World
[xzx@instance-157t533k 9_9]$
5、tail指令
tail命令从指定点开始将文件写到标准输出中(打印到控制台)。使用tail命令的-f选项可以方边的查询正在改变的日志文件,tail -f filename 会把filename里最尾部的内容显示在屏幕上,并且不断刷新,使你看到最新的内容
语法:tail [必要参数] [选择参数] [文件]
功能:用于显示指定文件末尾的内容,不指定文件时,作为输入信息进行处理。常用查看日志文件
选项:
-f:循环读取
-n<行数>:显示后n行
[xzx@instance-157t533k 9_9]$ cat test.txt
hello world
hello Linux
Hello Linux
Hello World
i love c++
I Love C++
c/c++
C/C++
[xzx@instance-157t533k 9_9]$ tail -4 test.txt
i love c++
I Love C++
c/c++
C/C++
扩展:假如有一个4000行的日志文件,我想要查看1000~1020行的内容,在不使用less、more的前提下,只用head和tail,该如何实现呢?
先通过for循环生成一个4000文本文件演示
[xzx@instance-157t533k 9_9]$ for((i=1;i<=4000;i++)); do echo "Linux $i"; done >> data.txt
[xzx@instance-157t533k 9_9]$ wc -l data.txt
4000 data.txt
通过wc -l也能验证已成功生成4000行文本文件
1、借用临时文件tmp.txt
先head -1020 data.txt > tmp.txt
后tail -21 tmp.txt
[xzx@instance-157t533k 9_9]$ head -1020 data.txt > tmp.txt
[xzx@instance-157t533k 9_9]$ tail -21 tmp.txt
Linux 1000
Linux 1001
Linux 1002
Linux 1003
Linux 1004
Linux 1005
Linux 1006
Linux 1007
Linux 1008
Linux 1009
Linux 1010
Linux 1011
Linux 1012
Linux 1013
Linux 1014
Linux 1015
Linux 1016
Linux 1017
Linux 1018
Linux 1019
Linux 1020
如果不允许使用临时文件tmp,txt呢?
2、管道
head -1020 data.txt | tail -21
[xzx@instance-157t533k 9_9]$ head -1020 data.txt | tail -21
Linux 1000
Linux 1001
Linux 1002
Linux 1003
Linux 1004
Linux 1005
Linux 1006
Linux 1007
Linux 1008
Linux 1009
Linux 1010
Linux 1011
Linux 1012
Linux 1013
Linux 1014
Linux 1015
Linux 1016
Linux 1017
Linux 1018
Linux 1019
Linux 1020
|:一种符号,会被系统解释成管道(内存级)
为什么叫管道?
就像一根管子一样,左边输入处理后的结果,右边输出处理后的结果
管道的作用?
cat data.txt | head -50 | tail -20
[xzx@instance-157t533k 9_9]$ cat data.txt | head -50 | tail -20
Linux 31
Linux 32
Linux 33
Linux 34
Linux 35
Linux 36
Linux 37
Linux 38
Linux 39
Linux 40
Linux 41
Linux 42
Linux 43
Linux 44
Linux 45
Linux 46
Linux 47
Linux 48
Linux 49
Linux 50
通常可以支持流水线工作
四、总结
到这里,我们已经系统梳理了 Linux 中指令的本质、输入输出重定向的原理,以及 cat、more、less、head、tail 等核心文件查看指令的用法。回顾整个学习过程,其实贯穿始终的是两个关键逻辑:
其一,指令的本质是可执行程序。无论是系统自带的 gcc、ls,还是我们自己用 C 语言编译的 a.out,本质上都是存放在特定路径下的可执行文件。把自定义程序移动到 /usr/bin 等系统路径下,它就能像系统指令一样被调用 ------ 这也让 "安装" 和 "卸载" 的逻辑变得清晰:不过是可执行文件在系统路径中的 "拷贝" 与 "删除"。
其二,Linux 下 "一切皆文件" 的设计哲学。显示器、键盘、普通文本文件,都被抽象为具有读写能力的文件对象。输入重定向(<)、输出重定向(>)和追加重定向(>>),本质上都是改变了数据的 "读写对象"------ 比如把本该输出到显示器的内容,转向写入普通文件,或是把本该从键盘读取的数据,改为从指定文件读取。这种设计让 Linux 的 IO 操作极具灵活性,比如用echo > 文件名快速清空文件,用>>向日志文件追加内容,都是这一哲学的实际应用。
而在文件查看指令的选择上,我们也能根据场景找到最优解:cat 适合快速查看小文件,more 适合简单的分页浏览,less 凭借前后翻页和搜索功能成为大文件(如项目源码、日志)的 "正统工具",head 和 tail 则能精准截取文件的开头或结尾内容 ------ 甚至通过管道(|)组合使用(如head -1020 data.txt | tail -21),轻松实现 "查看中间指定行" 的需求,这正是 Linux 指令 "组合式效率" 的体现。
这些基础操作看似简单,却是后续学习 Shell 脚本、服务部署、日志分析等进阶内容的基石。建议大家多在终端中实践:尝试编译一个自定义 C 程序并将其变为系统指令,用重定向处理日志文件,用不同指令查看同一文件并对比差异 ------ 只有亲手操作,才能真正理解 Linux 的逻辑,让这些指令从 "陌生的命令" 变成 "顺手的工具"。
Linux 的学习是一个 "实践出真知" 的过程,后续我们还会深入更多核心知识点,比如 Shell 变量、权限管理、进程控制等。保持好奇心,多试、多错、多总结,你会逐渐感受到 Linux 系统的强大与魅力。