
ok,在学习这块内容之前我们先来了解一个命令:
[root@VM-0-16-centos 118]# which pwd
/usr/bin/pwdok,通过which指令,我们查看了pwd这个指令所在的路径
哦,不知道有没有uu发现了什么?我们所使用的这个pwd指令竟然是在一个路径下面
那为什么这个pwd指令是在一个路径下面,难道其他指令也有相应的路径吗?
为什么这么说呢?
我们先来看一下windows:
就比如我们下载的谷歌浏览器:

我们复制上面的路径在我们的c盘中进行查找——

我们看到我们下载的谷歌其实就是特定路径下的一个可执行程序。
那这里有个问题:下载和安装最朴素的理解是什么?
在C/C++编译形成可执行程序(.exe),这个是文件吗?

也是文件,是一个可执行文件,执行一个文件,我们需要:路径和文件名
那我们再通过which指令来查看几个指令——

pwd、touch、mkdir……这些命令的本质是Linux中特定路径下的一个文件,一个可执行文件,仅此而已(所以命令没有什么可怕的,就一个文件而已)
并且这些指令就是用C/C++写的,我们称之为二进制文件
Linux指令就是二进制文件被安装到(拷贝到)系统路径下,这样就可以直接被使用了,并且在Linux中所谓的软件安装,其实就是把可执行文件拷贝到系统路径下
一般which命令是在/uer/bin/路径下查找指定的可执行文件(或者是指令)所对应的路径
[root@VM-0-16-centos 118]# which pwd
/usr/bin/pwd
[root@VM-0-16-centos 118]# which mkdir
/usr/bin/mkdir
[root@VM-0-16-centos 118]# which touch
/usr/bin/touch在Linux中所谓的命令、指令、可执行文件、可执行程序、二进制文件……是一回事,运行一条指令无非就是在Linux特定路径下把一个二进制文件加载到内存中,然后让他跑起来
在前面的学习中,也许会有uu看到博主在使用ls、ls -l 以及 ll ,这些指令有什么区别呢?(这个也是一个面试题哦)
要看这个区别,那我们就要使用which命令来查看一下他们——
[root@VM-0-16-centos 118]# which ls -l
/usr/bin/which: invalid option -- 'l'
alias ls='ls --color=auto'
/usr/bin/ls
[root@VM-0-16-centos 118]# which ll
alias ll='ls -l --color=auto'
/usr/bin/ls
[root@VM-0-16-centos 118]# which ls
alias ls='ls --color=auto'
/usr/bin/ls等我们使用which命令分别查看这三个指令,我们发现这里的输出结果好像看不懂:

ok,那我们就要先来介绍一下alias——
[root@VM-0-16-centos 118]# alias zs='ls -a -l'
[root@VM-0-16-centos 118]# zs
total 8
drwxr-xr-x 2 root root 4096 Dec 16 22:12 .
dr-xr-x---. 9 root root 4096 Dec 16 22:08 ..
[root@VM-0-16-centos 118]# ls -a -l
total 8
drwxr-xr-x 2 root root 4096 Dec 16 22:12 .
dr-xr-x---. 9 root root 4096 Dec 16 22:08 ..
[root@VM-0-16-centos 118]# 
所以当这个指令比较长的时候,或者我们不想使用这个指令,我们就可以使用alias给这个指令搞一个别称,这是一种技巧——
[root@VM-0-16-centos 118]# alias rm='rm -i'但是,不要这么做!!!因为时间久了有可能会忘掉!!!
那我们怎么取消这个别名呢?
[root@VM-0-16-centos 118]# alias zs=' 'ok,学完了alias指令之后,我们接着看——
当我们使用which查看ls时,会有意想不到的事情发生——
[root@VM-0-16-centos 118]# which ls
alias ls='ls --color=auto'
/usr/bin/ls
那我们就来看一下分别执行ls和/usr/bin/ls,看看有啥区别——

这是因为ls指令默认是不带颜色的,之所以直接运行ls输出结果是带颜色的,是因为你默认执行的ls(直接运行ls)其实是ls(这个二进制文件本身的——/uer/bin/ls)的别名也是ls,只不过是给自己的别名默认吧color选项带上了
要是我们也想运行系统指定路径下的ls——/usr/bin/ls,并且运行结果是带颜色,我们可以带上这个 --color=auto


ok,现在是不是就很轻松的就可以看出来他们之间的区别——
ls -l 和 ll 是等价的,ll是ls -l的别名;ls是/usr/bin/ls的别名,加上了--color=auto的选项(颜色)
功能:查阅命令、函数、配置文件的详细说明(用法、选项、示例等) 语法:man [选项] 命令
常用选项:
解释一下:man手册分为9个章节,其中前3个比较常用
[root@VM-4-4-centos ~]$ man printf # 查看printf指令(没错,printf也是⼀个指 1
令)
[root@VM-4-4-centos ~]$ man fork # 查看系统调⽤,默认没有这个指令,man就⾃动
去2号⼿册查找
[root@VM-4-4-centos ~]$ man 2 frok # 查看系统调⽤
[root@VM-4-4-centos ~]$ man 3 printf # 查看C库函数
[root@VM-4-4-centos ~]$ man 7 signal # 查看变量
[root@VM-4-4-centos ~]$ man 7 environ
[root@VM-4-4-centos ~]$ man man # 查看man⼿册⾃⼰man的查找原则是就近原则,默认是从1号手册开始查找,匹配到就结束,匹配不到就继续往后查找
[root@VM-0-16-centos 118]# man 指令从1号手册开始查找,若1号手册中有,找到就结束;若1号手册中没有找到,就到2号手册中找,找到就结束;若2号手册中没有,就到3号手册中找,找到就结束
[root@VM-0-16-centos 118]# man 1 pwd
但是,也有可能指令属于多个手册,比如:printf
printf既是一个c中的库函数,也是一个指令!!!
[root@VM-0-16-centos 118]# printf "%d,%s.%f\n" 12345 "hello world" 3.14
12345,hello world.3.140000printf的作用是可以格式化向当前的终端输出指定格式的内容
man的下载方式:
ok,暂时不说为什么,我们先直接使用这个结论!!!
Linux下一切皆文件,那就说明:显示器、键盘、磁盘、网卡、普通文件……都是文件
从上面的学习中,我们知道printf的作用可以格式化向当前的终端输出指定格式的内容,但是到了这里——Linux下一切皆文件中就有了一些变化
[root@VM-0-16-centos ~]# printf "hello world\n"
hello world就不是向显示器中打印hello world,printf的作用是向显示器文件中写入一个字符串,这个字符串叫做:hello world
不知道有没有uu听说过这样一句话——C/C++当中任何一个程序都有三种标准输入输出被默认打开

由于Linux下一切皆文件,所以显示器,显示器,键盘这些都是文件,只要是文件,我就可以使用C语言的方式打开这个文件,我需要知道这个文件的路径,然后使用fopen打开它,打开之后,我就会得到一个FILE*的指针——

所谓的标准输入、标准输出、标准错误,在C/C++当中的任何一个程序中默认是打开的
为什么这么说呢?是因为我C/C++程序默认用fopen把指定路径下的(键盘文件,显示器文件)打开,然后得到stdin、stdout、stderr这样的文件指针。
所以我们想要向显示器文件中写入,我们可以直接使用fprintf——

我们也可以使用fwrite——

这里有个疑问:为什么Linux下一切皆文件呢? 这是因为未来要简化在系统层面对设备的访问
那为什么要打开这三个呢?(标准输入、标准输出、标准错误)
因为程序需要通过标准输入获取数据,通过标准输出打印结果,所以一般程序都是默认打开标准输入和标准输出,方便程序员通过printf输出结果,scanf输入数据
那此时我想向标准输出(显示器)写入数据,可以直接使用printf——
[root@VM-0-16-centos 118]# printf "hello world\n"
hello world注意:printf默认是不带\n的!!!
除了使用printf可以向显示器写入数据,还可以使用echo——
[root@VM-0-16-centos 118]# echo "hello world"
hello worldecho默认是带 \n 的!!!
echo 命令默认是向显示器中写入一个字符串,echo后面跟什么字符串,就写什么字符串到显示器上
echo 只能向显示器中写入字符串吗?
当然不是~~~,那接下来,我们就要来看一下——输出重定向
什么是输出重定向呢?
输出重定向就是将命令默认输出到屏幕(终端)的内容,改变其流向,让它输出到其他地方(主要是文件)。
当我们在echo的后面加上重定向标准输出 >,这样我们就可以改变其流向,将本来写入显示器的字符串写入到相应的文件中。
我们通过代码来演示一下:
[root@VM-0-16-centos 118]# echo "hello world" > message.txt通过上面的这种写法,我们就可以改变写入方向,写入到指定的文件中,将本来写入显示器的字符串写入到message.txt文件中。
重定向标准输出 >,>的做法是这样的——
首先检查当前目录下该文件是否存在——
[root@VM-0-16-centos 118]# echo "hello world" > message.txt
[root@VM-0-16-centos 118]# echo "hello world" > ./message.txt以上两种写法都可以——

当前目录中无message.txt——

向message.txt文件中写入"hello bit"——

此时message.txt存在,我们再向其中写入:"hello world":

如果此时我想把message.txt清空,该怎么办?
是这样吗?——

ok,显然不是这样写的,因为echo中默认是有\n的,所以这个message.txt中看似是空的,其实里面还有一个\n。
那是这样写的吗?
[root@VM-0-16-centos 118]# printf "" >message.txt这样写是可以的,但是有点子搓——
[root@VM-0-16-centos 118]# >message.txt这样就可以自动清空文件!!!

重定向标准输出 > ,这个 > 的作用远不止于此——
我们看到,当这个文件存在并且里面有内容的时候,>+文件名 可以清空文件,那如果这个文件不存在呢?
[root@VM-0-16-centos 118]# >test.txtok,如果>+文件名 ,这个文件不存在,则新建一个空的文件
下一个问题是:有些命令是向显示器写入,但是未来学的有些命令有可能是从键盘(标准输入)做读取,比如:cat
[root@VM-0-16-centos 118]# cat message.txt
hello world从message.txt文件中读取内容,然后将读取到的内容回显到显示器上
那如果cat后面没有跟文件名呢?
[root@VM-0-16-centos 118]# cat那就是我们从键盘中输入,然后回显到显示器上,按ctrl c结束输入——

那cat可不可以从其他的文件中读取内容,然后回显到显示器上呢?是可以的
输入重定向是指改变命令的标准输入(stdin,文件描述符 0) 的来源,使其从默认的键盘输入改为从文件或其他来源读取数据。
<command < input_file将文件 input_file 的内容作为命令的标准输入。
那这个就可以配合 cat 使用了!!!
cat < 文件名cat不要从键盘(标准输入)中读取数据,转换成从指定文件中读内容,把读到的内容写入显示器(标准输出),在显示器上显示出来
[root@VM-0-16-centos 118]# cat < message.txt
hello world从message.txt文件中读,然后将读到的内容写入到显示器文件中,在显示器上显示出来
那我是不是就可以将从指定的文件中读取数据,然后将读到的内容不回显到显示器上,而是通过输出重定向改变其流的转向,从本来应该写入到显示器上,转向写入到指定文件中。
[root@VM-0-16-centos 118]# cat < message.txt > test.txt
[root@VM-0-16-centos 118]# cat < test.txt
hello world
[root@VM-0-16-centos 118]# cat < message.txt
hello world这样就将message.txt中的内容拷贝到test.txt中了!!!
注意:只能是文本文件

ok,通过上面的学习,我们知道使用echo 向文件中写入,如果该文件存在会先清空该文件,然后写入:

但是此时,我不想每次都清空原来的内容,我现在就想每次内容增多,不想每次向文件中echo都清空原来的内容,那我们就要需要学习下面的内容了——
基本语法与作用:
command >> filename作用:将命令的输出追加到文件的末尾,不会覆盖原有内容。
[root@VM-0-16-centos 118]# echo "aaaaaaaa" >> message.txt
这样我们就可以在原来的基础上叠加,不清空原来的内容!!!
ok,既然我们今天可以向指定的文件中写入,那么以后也可以向指定的硬件中写入(或者向网络中写入),因为Linux下一切皆文件!!!
Linux 中所有对象抽象为文件,包括硬件设备(存于 /dev 目录)。
终端窗口对应 /dev/pts/N 设备文件(N 为编号),每当我们登入Linux系统,Linux系统都会在/dev/pts/文件中新增一个文件——/dev/pts/0(最开始为0,后面每增加一个,就为1、2、3……)

echo 默认是向0这个文件里面写入的(也就是向/dev/pts/0)

新增一个终端,就会在/dev/pts/文件中新写一个文件1(/dev/pts/1)

那我可以在0(/dev/pts/0)这个终端下面向1(/dev/pts/1)这个终端中写入——

这样我就可以在一个终端向另一个终端中做写入了!!!
既然1都有文件名,那我是不是就可以把这个/dev/pts/1,/dev/pts/0打开,打开之后,就可以通过fread、fwirte向0或者1这个终端下去写去读!
Linux下一切皆文件,终端也是文件!!!

为什么要进行上面的操作呢?
因为显示器叫做字符设备,对应的第一列第一个字符为c

功能:复制文件或目录,源文件保留(类似 “复制粘贴”) 语法:cp [选项] 源代码或目录 目标文件或目录 说明:
常用选项:
[root@VM-0-16-centos 118]# cp message.txt hello.txtmessage.txt和hello.txt在相同的路径下,将message.txt中的内容拷贝到hello.txt中
[root@VM-0-16-centos ~]# cp hello.txt ../拷贝的文件不存在,并且没有指明文件名,就把同名文件以及内容拷贝过去
拷贝同名文件到上级,将hello.txt文件拷贝到上级目录中,上级目录中有一个hello.txt文件
[root@VM-0-16-centos 118]# cd hello.txt ../118.txt拷贝文件到上级目录:
拷贝一个目录需要递归拷贝
加上 -r 表示递归拷贝
[root@VM-0-16-centos ~]# cp -r 118 118-backup但是这样拷贝会有一点问题——
如果118-backup不存在,则创建一个该目录,然后进行拷贝;但是,如果118-backup这个目录存在,则会把118-backup看成一个路径,然后就把118拷贝到118-backup中。

cp src dest
若需要强制拷贝 cp -f src destcp -r src dest
若需要强制拷贝 cp -rf src dest
功能:移动文件/目录,重命名(同一目录下的移动),源文件删除(类似“剪切粘贴”)
语法:mv [选项] 源文件/源目录 目标文件/目标目录
功能:
常用选项:
[root@VM-0-16-centos 118]# mv test.txt ..将test.txt移动到上级目录,并且不重命名
root@VM-0-16-centos 118]# mv ../test.txt .将上级目录中的test.txt移动到本级目录,并且不重命名
[root@VM-0-16-centos 118]# mv test.txt ../118.txt将test.txt移动到上级目录并且重命名为118.txt
[root@VM-0-16-centos 118]# mv hello.txt ../test.txt如果目标文件存在,则会覆盖目标文件中的内容

# 更改名称
[root@VM-4-4-centos test-mv]# touch myfile.txt
[root@VM-4-4-centos test-mv]# ll
total 0
-rw-r--r-- 1 root root 0 Oct 12 20:58 myfile.txt
[root@VM-4-4-centos test-mv]# mv myfile.txt yourfile.txt
[root@VM-4-4-centos test-mv]# ll
total 0
-rw-r--r-- 1 root root 0 Oct 12 20:58 yourfile.txt
# 如果当前路径存在同名文件,改名即覆盖。这个普通用户用-i 会在覆盖前询问
[root@VM-4-4-centos test-mv]# touch myfile.txt
[root@VM-4-4-centos test-mv]# ll
total 0
-rw-r--r-- 1 root root 0 Oct 12 20:59 myfile.txt
-rw-r--r-- 1 root root 0 Oct 12 20:58 yourfile.txt
[root@VM-4-4-centos test-mv]# mv yourfile.txt myfile.txt
mv: overwrite ‘myfile.txt’? y
[root@VM-4-4-centos test-mv]# ll
total 0
-rw-r--r-- 1 root root 0 Oct 12 20:58 myfile.txt
# mv整个目录
[root@VM-4-4-centos test-mv]# touch myfile.txt
[root@VM-4-4-centos test-mv]# mkdir temp
[root@VM-4-4-centos test-mv]# ll
total 4
-rw-r--r-- 1 root root 0 Oct 12 21:10 myfile.txt
drwxr-xr-x 2 root root 4096 Oct 12 21:10 temp
[root@VM-4-4-centos test-mv]# mv myfile.txt temp
[root@VM-4-4-centos test-mv]# ls
temp
[root@VM-4-4-centos test-mv]# mv temp ../
[root@VM-4-4-centos test-mv]# ls
[root@VM-4-4-centos test-mv]# ls -d ../temp
../temp
指令/功能 | 核心功能 | 必学选项/用法 | 典型场景 |
|---|---|---|---|
which | 定位命令对应的可执行文件路径 | -a:显示所有匹配路径(适合同名多版本程序,如 which -a python) | 1. 检查命令是否安装(无结果则未安装) 2. 区分版本(如 python 和 python3) |
alias | 为长命令设置简短别名 | 1. 设置:alias 别名='完整命令'(如 alias ll='ls -lah') 2. 查看:直接输入 alias 3. 删除:unalias 别名 | 简化高频命令: 1. alias ll='ls -lah' 2. alias cdp='cd /home/user/projects' |
man | 查看命令/系统调用/库函数的手册 | 1. -k 关键词:搜索相关命令(如 man -k copy) 2. 章节号: - 1:普通命令(man 1 ls) - 2:系统调用(man 2 open) - 3:库函数(man 3 printf) | 1. 查命令用法(man ls) 2. 查编程接口(程序员用) |
echo | 输出文本/变量到终端或文件 | 1. -e:支持转义符(\n换行,\t制表) 2. -n:输出后不换行 3. 重定向:>覆盖,>>追加 | 1. 创建文件:echo "内容" > file.txt 2. 调试输出:echo $PATH 3. 设备通信:向终端发送消息 |
重定向 | 改变程序输入/输出流向 | 1. 输出:>覆盖,>>追加 2. 错误:2>重定向错误 3. 输入:<从文件读取 4. 合并:&>输出+错误 | 1. 日志记录:cmd >> log.txt 2>&1 2. 批量处理:wc -l < file.txt 3. 错误隔离:cmd 2> /dev/null |
cp | 复制文件/目录 | 1. -r/-R:递归复制目录 2. -i:覆盖前确认 3. -v:显示详情 4. -f:强制覆盖 | 1. 备份数据:cp -r docs/ backup/ 2. 同步文件:cp -v *.jpg photos/ 3. 配置备份:cp config.cfg config.bak |
mv | 移动/重命名文件/目录 | 1. -i:覆盖前确认 2. -v:显示详情 3. -n:不覆盖已存在文件 4. -u:只移动较新文件 | 1. 整理文件:mv *.log logs/ 2. 批量重命名:mv old_*.txt new_*.txt 3. 目录操作:mv dir1/ dir2/ |
uu们,本文的内容到这里就全部结束了,再次感谢您的阅读!
结语:希望对学习Linux相关内容的uu有所帮助,不要忘记给博主“一键三连”哦!