写在前面
今天我们继续学习Linux的基本指令,
这里是上一篇博客的链接:http://t.csdn.cn/9AgHP
接下来我会继续讲解Linux指令相关内容。
目录
写在前面
1. man
描述:
用法:
例子:
例1:
例2:
2. cp
描述:
用法:
例子:
例1:
例2:
例3:
例4:
3. mv
描述:
用法:
例子:
例1:
例2:
例3:
4. 扩展
4.1 出现奇怪的问题咋办
4.2 如何理解指令?
4.3 别名
4.4 补充内容:(重定向)
输出重定向:
追加重定向:
补充:
输入重定向
5. cat
描述:
用法:
例子:
例1:
例2:
6. more
描述:
用法:
例子:
例1:
例2:
7. less
描述:
用法:
例子:
例1:
8, 9. head 和 tail
描述:
用法:
例子:
例1:
例2:
补充内容:(管道)
总结:
写在最后:
1. man
描述:
Linux的命令千千万,我们不可能全部都记住。
man手册可以用来查询一些我们忘记或者不了解的指令/接口。
用法:
man + (数字) + 指令名称
例子:
例1:
比如说我们可以用man手册学习一下ls命令:
我们可以看到有很多选项:
注:(如果man手册不起作用,可以输入:yum install -y man-pages )
例2:
既然man手册可以查看系统的指令,我们当然也可以用man手册学习如何使用man手册:
我们可以看见,man手册有很多选项:
这里我们只需要了解最常用的前3个:
1. 第一个,也就是直接使用man可以查询Linux自带指令
2. 第二个,使用 man 2 选项可以查询系统调用接口
例:
fork就是一个系统调用接口,可以创建一个子进程:
3. 第三个,使用 man 3 选项可以查看C语言的接口
例:
相信大家对printf并不陌生:
这就是我们需要学习的三个选项。
2. cp
描述:
这是一个拷贝指令,可以拷贝文件、目录。
用法:
cp + 选项 + 源文件或目录 目标文件或目录
常用选项:-r (递归拷贝)
例子:
例1:
拷贝文件到当前的目录下。
例2:
拷贝目录到当前文件下。
例3:
可以把文件拷贝到上级目录,
所以,我们可以通过相对路径,将文件拷贝到我们想要的地方:
我们拷贝了一个文件进test目录里面。
例4:
当然,我们也可以验证一下,这个拷贝是否真的把整个文件拷贝了:
我们可以观察到,test.txt文件里面的内容,
copy.txt里面也有,可以得出结论,cp确实拷贝了这个文件。
注:(补充一点:同一个目录下不能存在同名文件)
注:(echo 是输出指令,可以向屏幕输出)(举个例子)
例:(我们往屏幕输出了 hello Linux )
注:( > 是输出重定向,我们将echo输出的内容重定向到了test.txt文件里面 )
注:(cat 指令可以查看文件内容)
3. mv
描述:
可以用来移动文件或者给文件改名。
用法:
mv + 文件原名 + 新的名字
mv + 文件名 + 目录
例子:
例1:
修改名字:
把test.txt 改名成name了。
例2:
移动文件:
我们把test目录移动到了上级目录。
例3:
移动并改名:
我们可以发现,移动到上级目录的test被改名成了name。
以上是mv命令。
4. 扩展
4.1 出现奇怪的问题咋办
比如说,Linux的命令行输出命令用不了了:
你好像输什么他都不停止,这个时候,可以:
Ctrl + c
如果遇到解决不了的问题或者死循环之类的,可以用这个指令杀掉当前的进程。
注:(可以解决大部分问题(但不是万能的!))
4.2 如何理解指令?
1. 我们发现指令是可以运行的,
指令和可执行程序都可以运行->指令就是可执行程序!
那我们的指令放在哪里呢?
我们可以看到,随便输入的字符,当前的shell跟我们说 not found 找不到指令,
那系统是在哪找我们的指令的?
2. 指令在执行前,做了什么?
先在系统中查找对应的指令(指令一定是在系统的某一个位置存在的!)
问题来了:指令究竟在哪里?
实际上,指令就在这个目录里面:
我们发现这些指令都是存在的!
因此我们可以得出这样一个结论,
指令是在系统特定的路径下存在的!
而这些指令一定是某种可执行程序(而且一定是用C/C++/shell...这些语言写出来的!)
那么,现在我们就要做一个实验了:
我们用nano(记事本)写一段C语言程序
然后执行:
注:(这里是用gcc编译这段代码)
然后改名:
既然我们这个是可执行程序,如果我们把它放到指令的位置,
只不是也能像指令一样执行呢???
确实是这样的!!!
(但是把程序放进指令的地方需要比较高的权限,我们这里切换到root用户)
注:(我用su 命令切换到root用户(输入su,然后输入root的密码))
我们将mytest 拷贝进指令的位置:
发现没有,mytest真的可以像指令一样使用了。
结论:
指令的本质就是可执行程序,
和我们自己写的代码编译好的可执行程序没有本质区别!(唯一的区别可能是别写的比你好...)
注:(我们把这个可执行程序拷贝到系统,这其实就是一种安装)
当然,最后别乱污染系统的指令:
我们就直接把它删除了。 (这其实就是卸载)
所以:系统的指令其实就是别人写好的可执行程序放到系统里面,仅此而已。
最后总结:指令的本质就是一个文件(一个可执行的文件)安装到了系统的某种路径下。
(可以在我们要使用的时候自动查找,仅此而已。)
4.3 别名
那话又说回来,ls -l 为什么可以写成 ll 呢?
例:
我们可以看看 ll 指令是啥:
注:(which 指令可以看一条指令是啥,第二行是该指令的位置)
例:(我们也可以看看其他指令,比如:rm)
这里就不再去看其他指令了,感兴趣的话可以自己去试试。
我们观察 ll 指令可以发现,他有个:alias ll = 'ls -l -- color=auto'
这个意思其实就是 ll 是 ls -l 的别名,而后面那个 -- color=auto 是配色方案。
注:(有时候为了方便使用,就可以给指令设置别名)
例:(比如说我们想起个别名)
我给mycmd 起了个别名,就能直接使用了。(就是 ls -al )
注:(这个重命名方法只存在于这一次(你关掉xshell重进就会没了))
那为什么 ll 一直都在呢?因为他被写在了配置文件里面。
注:(不建议自己重命名,学好系统的指令再说)
4.4 补充内容:(重定向)
我在这里抛出一个概念:(或者说是理解Linux的一种思想)
Linux下一切皆文件 - 比如:显示器、键盘、普通文件...
比如说:(我用这三个例子进行说明)
1. 我们向显示器写入,不就是对显示器写入吗:write()(对显示器文件进行写入操作)
实际上,我们是不能读取显示器文件的信息的,但是我们也认为在显示器文件
里面是存在:read() 这样的一个函数/方法,但是这是个空方法,无法使用而已。
2. 系统从键盘读取数据,那么可以想见,键盘具有:read() 这样的一个函数,
系统不可能往键盘里写入什么数据,总不可能系统给键盘写入一个a,你键盘的a建就跳起来吧,
所以我们可以推断出键盘文件中:write() 写入函数是一个空函数,无法使用。
3. 而普通文件,我们可以对文件进行读取 read() 和 写入 write()。
根据这三个例子,我们可以发现他们都可以具有读写方法,所以我们当然可以把他们当文件!
注:(当然,文件操作的方法肯定不止读写,这里我使用读写方法作为例子举例。)
注:(系统里面还有很多很多东西,还有硬件设备,在Linux下,他们都是文件吗?是!!!)
总结:Linux下一切皆文件!(初步理解)
输出重定向:
所以:(我们使用 echo 指令往显示器上打印这串字符)
现在我们把这句话说成:echo 指令将这串字符写入到显示器文件中。
而我们使用 > 重定向,显示器上就没有显示出这段话了,
将原本应该写入到显示器文件的内容写入到out.txt文件里面,
这种操作就叫做重定向。
而 cat out.txt 就相当于把out.txt文件的数据写入到显示器文件里面。
输出重定向有一个特点:
例2:
实际上进行输出重定向的时候会覆盖原内容,具体操作如下:
1. 清空文件
2. 写入新内容
例2:
我们发现如果重定向往文件写入空,文件就清空了(对应上面的操作)
追加重定向:
我们发现用 >> 追加重定向,就不会清空文件,并在文件尾写入。
注:(在C语言文件操作中,使用 -a 选项其实就是追加(append))
注:(echo 指令自带换行)(printf 指令不自带换行(有兴趣可以试试))
补充:
如果我们使用cat指令,后面什么都不加会怎么样?
我们输入什么,他就自动输出什么,
结合我们刚刚学的,cat 指令默认就是从输入设备(键盘)读取,写入到显示器文件中。
输入重定向
本来 cat 应该从键盘文件读取数据,现在变成从指定文件读取了,
这就是输入重定向。
那么补充知识暂时到这里了,我们继续学习指令。
5. cat
描述:
cat 命令可以查看文件内容。
用法:
cat + 文件名
例子:
例1:
用cat 查看test.c文件内容。
例2:
如果一个文件内容很多会咋样?
我们用shell 脚步写一万行hello Linux进test.txt文件
注:( cnt=1; while [ $cnt -le 10000 ]; do echo "hello Linux $cnt"; let cnt++; done > test.txt )
我们发现用cat 查看该文件内容,直接被刷屏了,
如果我们想要看开头咋办,那就会很麻烦。
6. more
描述:
可以查看文件内容。
用法:
more + 文件名
选项 -n (可以选择看哪行)
例子:
例1:
用more查看test.txt文件:
会从头开始查看。
注:(按 enter 下翻)(按 q 键退出)
实际上,我们没办法上翻(more只支持下翻...)
我们可以用 / 查找文件内容:
例2:
我们可以在用more的时候就选择看哪行:
这样就直接跳转到这里了:
实际上我们用more用的不多(因为其实不太好用)
7. less
描述:
可以查看文件内容的命令。
用法:
less + 文件名
例子:
例1:
用less指令查看test.txt文件:
less 命令也支持用 / 查找内容:
这样就能找到999出现的地方:
注:(less 支持上下翻(直接用键盘的上下键即可))
8, 9. head 和 tail
描述:
head可以查看文件头部内容,tail可以查看文件尾部内容。
用法:
head -n 文件名
tail -n 文件名
选项:n代表你选择的行数(也可以不加)
例子:
例1:
用head查看文件头:
用head从上往下查看文件指定位置:
注:(查看头1000行内容)
例2:
用less查看文件尾:
用tail从下往上查看文件大小:
注:(查看尾5行的内容)
补充内容:(管道)
如果有这样一种场景,
我们想要查看这个文本的1000~1020行,我们可以怎么做?
我们当然可以用less直接去查找,
但是,我们也可以这样:
那么问题来了,这个 | 是什么?
这个 | 就是管道文件。
管道文件是一个内存级的文件,(我们该怎么理解这个‘内存级’?)
比如说:
我们要修改一个文件,系统是直接在磁盘了修改,还是先加载到内存呢?
答案显而易见,系统需要先把文件加载到内存,
换句话说,所有的文件都需要被加载到内存再进行操作,
所以这些文件在一定的生命周期里他们都是内存文件,
一个程序把自己的执行结果写到管道文件里,另一个文件再把数据从管道里读出来,
这就是管道。
所以上面的那张图片的工作原理就是这样的。
注:(管道通常可以支持流水线工作(将数据一步步加工直到我们满意))
总结:
我们今天学习了Linux一些新的指令,
还加深了对Linux系统的理解,接触了Linux下一切皆文件的思想,
认识到指令其实就是Linux系统下的软件,一个可执行程序,而且我们能在系统找到他们,
了解了重定向以及管道相关的知识。
想要和我一起继续学习和探索Linux的奥秘,可以订阅这个专栏哟~Linux从入门到精通。
写在最后:
以上就是本篇文章的内容了,感谢你的阅读。
如果感到有所收获的话可以给博主点一个赞哦。
如果文章内容有遗漏或者错误的地方欢迎私信博主或者在评论区指出~