之前一直没系统的学习过 Linux,也就简单的用过Ubuntu,或者在本地的虚拟机上,搭了搭开发的环境,以及半查半折腾的在阿里云的 CentOS 系统上部署了一个博客,现在因为有时候用的稍微多了一点,正好家里也有几本Linux的书,那就把这一部分好好学习,顺便整理一下,难免会有一些错误,有什么问题希望大家不吝赐教 ~
表格在手机中展示的效果并不是很好,例如下面的 -xxx 选项会有换行的问题,如果觉得影响的话,可以去看我的博客,迟一点我推上去,或者去掘金社区看我的文章,我的掘金账号:BWH_Steven 掘金对于md的兼容性还是非常好的
shell 是什么,可能大家还有点迷糊,但是 terminal 这个词或许会感觉熟悉一点,是的,一般在学习阶段,很多人安装系统的时候会选择安装图形化界面,相比较纯图形化界面,图形化界面看起来会友好一些,而在看一些书籍,视频的时候,我们会非常频繁的使用到一个名叫 terminal (终端) 的东西,它在图形用户界面中,也算是一个非常重要的东西了,我们就从这里讲起,Rush !!!
终端(termimal),它确切的叫法是终端仿真器(termimal emulator),当然了大部分人更习惯于叫前者
起码从咱们用户看起来的角度来看,它提供了一个命令的输入输出环境,也就是说你想执行点啥命令操作,都可以在这里面通过具体的命令语法去执行
标题是 Shell ,这都说了半天了,咋还没扯到呢
来了,来了,他们两个的关系很密切,在图形界面中的用户终端中,可以在这里用来启动 bash(也就是 Shell,因为 Linux 默认是使用 bash 后面你就知道,用它的快乐你想象不到)也就是说当你打开一个 terminal 的时候,terminal 和 Shell 会被操作系统关联起来,当我们在 terminal 中输入命令后,shell 就负责解释命令
随意将 terminal 简单的理解成一个 “工具” 的概念也是可以的
下图就是分别在 乌班图 和 CentOS 下的终端界面
shell是一个命令行解释器,是 Linux 内核的一个外壳,负责外界与 Linux 内核的交互cart
shell接收用户或者其他应用程序的命令,然后将这些命令转化成内核能理解的语言并传给内核,内核执行命令完成后将结果返回给用户或者应用程序
上面一直又谈到了 Linux 的内核,这又是什么呢?
早在 UNIX 时期,shell 有着许多版本,比如sh、C SHell、K SHell、等等,每一种Shell都各有特点
Bash(Bournce-Again SHell)这个shell是Bourne Shell的增强版本
同样现在大部分主流的 Linux 默认的选择了Bash解释器
通过这一张图片,大家应该就很好理解定义中所说 Shell 所处的地位了,简单的说,它就像是一个翻译官,帮助 用户与内核之间交流,用户想要执行一些 “命令” 就去告诉 Shell ,然后 Shell 再去和内核沟通,最终调用相应的程序或者服务去完成
到这里,小小的总结一下:terminal 这个工具活跃在为用户服务的面前,而 Shell 活跃在为用户服务的背后
后面继续学习的东西,基本不涉及到图形界面了,不过作为初学,仍然可以在桌面中调出 terminal 进行使用,图形化会使得学习的压力也小一点,对我个人而言,平时 Linux 更多的是用来做服务器,稳定,可靠,安全是第一个考虑的问题,图形界面虽然简单,但是却需要安装更多服务,开放更多的端口,同时占用更多的系统资源,所以下面都涉及图形界面的讲解,再次强调一下,Ubuntu 和 CentOS 以及其他发行版本有些命令是不同的,但是基础的基本也都差不多的,处于学习的态度,大家完全可以在学习中使用不同的发行版本试一试,如果你是一名开发的选手,我更推荐你在 CentOS 上实践,反正不会咱就学,不对咱就改呗
首先看一下命令的基本格式
基本格式:command [options] [arguments]
即:命令 [选项] [参数]
注意:别忘了命令后加空格
命令格式中的 [] 代表可选,有些命令可以不写选项或参数,也能执行
下面用常见的 ls
命令讲解一下(具体的知识点会放到下面说,这里只为了演示基本格式)
ls 的基本作用就是展开目录,而不同的选项、参数
ls
指令(无选项参数)后回车,那是因为有默认参数存在ls -l
显示出详细信息,这是一个短格式指令,所以使用 一个减号调用 -
ls --all
列出包括隐藏文件的指令,这是这是一个长格式指令,它是英文完整单词,所以使用 两个减号调用 --
一般情况下,短格式选项是长格式选项的缩写,也就是一个短格式选项会有对应的长格式选项,就例如上面使用的长格式指令 ls --all
和其对应的短格式指令 ls -a
的效果是一致的
但是也有一些例外比如刚开始的 ls 命令的短格式选项 -l 就没有对应的长格式选项
Linux 和 Windows 还是有很大区别的,在正式学习命令之前,还有一个知识需要补充介绍,也就是目录的结构
我拿一台空着的乌班图给大家做演示,当然不同的发行版本,还是有区别的,不过这一篇主要是一些常用的基本命令,所以也没关系,大家也可以CentOS 等等
大家可以在终端输入 ls /
看一下根目录下有些什么东西
当然了,其中自然有一些是比较重要的,我们把关键的一些介绍一下
我们只摘出来其中几个重要的介绍,当然还有一些就需要大家自己去探索一下啦~
Linux 系统中所有的文件(目录)都被分为以根目录 “/” 开始的倒置的树状结构,学过数据结构中 “树” 这个结构,大家应该就明白了(节点上少,下多,像一个倒过来的树)
Linux使用正斜线 /
而不是反斜线 \
来在文件路径中划分目录
在 Shell 中:
~
代表用户主目录/
代表根目录.
代表当前目录..
代表当前目录的上一级目录这几个点,作为一个默认已知的基础铺垫,后面配合各种命令会及极其常用
最重要的一点:绝对路径一定是从根目录 /
写起的
例如,通过绝对路径打开 usr 文件夹 下的 src 目录
我们以 root 用户目录出发(cd
为切换目录,pwd
为显示当前路径 后面会介绍,这里主要看绝对和相对路径的特点)
root@ubuntu:~# cd /usr/src
root@ubuntu:/usr/src# pwd
/usr/src
上面的例子,即使我们身在 root 目录下,但是通过绝对路径我们仍然可以跳转到我们想要去的目录下
root@ubuntu:~# cd usr/src
bash: cd: usr/src: No such file or directory
如果我们不从 /
写起,就会提醒找不到这个文件或者目录
依旧从 root 目录出发,由于 root 的前一级目录就是 /
根目录,所以可以通过 cd ..
返回上一级目录,或者直接通过 cd /
回到根目录,由于 usr 就在根目录下,所以可以通过 cd ./usr
或者cd usr
相对路径的写法进入,为了演示,我都拆开写了,大家也可以在 root 目录下,使用 ../usr
直接打开 usr目录
root@ubuntu:~# cd ..
root@ubuntu:/# cd ./usr
root@ubuntu:/usr# cd ./src
root@ubuntu:/usr/src# pwd
/usr/src
绝对路径永远是是相对于根路径 / 的,文件不动,则它的绝对路径不变
而相对路径是相对于当前所在目录而言的,当前所在目录改变,文件的相对路径也会变化
当你登录后,首次出现的就是在用户(或超级用户)的目录下,由于你登录的账户不同可能会有不同的显示
#
即超级用户状态登录,例如:root@ubuntu:~#
我这里选择了使用 root 直接登录,当然你也可以选择使用普通用户登录,但是最好给其赋予 root 权限,否则学习过程中,有一些命令和操作是没有权限执行的
补充:不同的发行版本中,提示符的外观可能有些许不同,但是基本是一致的,通常会包括 (用户名@机器名 目录 和 #/$ 符号)
用户登录后,要有一个初始登录的位置,这个初始登录位置就称为用户的家目录(也称用户的主目录)
登录后也会直接跳转到这个目录下
cd 命令用于切换工作路径:也就是说,输入 cd
后接着输入绝对路径或者相对路径就可以完成目录的切换了
这个命令也太常用了,通过cd 可以非常灵活的切换工作目录,除了上面演示的绝对路径以及相对路径的写法,还有一些非常方便的写法可以搭配在 cd 后面
~
代表当前登录用户的主目录
~
用户名 表示切换至指定用户的主目录
-
代表上次所在目录
.
代表当前目录
..
代表上级目录
随便写一个,大家可以参考下格式
root@ubuntu:/usr/src# cd ~
root@ubuntu:~#
使用pwd命令可以显示当前用户所处的工作目录的绝对路径,pwd 是 Print Working Directory 的缩写
注意点:
Ubuntu 默认的终端下面,进入很多层的目录后,前面那个提示符会显示完整的路径,我感觉不是很舒服,尤其是进去的目录比较深的时候,这一点可以度娘一下,把它改掉
root@ubuntu:/etc/vim#
CnetOS,虽然也显示出当前所在的目录,但它只会列出整个路径中最后的那一个目录,同样是 /etc/vim 文件夹,下面这种前面只显示 vim
root@localhost vim]#
通过前面的 cd 以及 pwd 命令我们已经在 Linux 文件系统中乱跑了,但是再怎么跑也得有个方向,ls 就可以帮助我们看到你跑到(切换)的这个地方(目录)放着哪些文件,然后再决定进行下一步操作
所以这个 ls 也是非常常用的,使用频率甚至超过了cd
root@ubuntu:/# ls /usr
bin games include lib local sbin share src
root@ubuntu:/# ls /home/gzah7799 /usr
/home/gzah7799:
Desktop Documents Downloads examples.desktop Music Pictures Public Templates Videos
/usr:
bin games include lib local sbin share src
搭配一点参数,带来加倍的快乐,当然这里都是短指令,例如 -a 的长指令是 -all 我都没有列举哈,我摘了几个常用的,不过这几个里面也主要用 -a 和 -l 比较多
显示所有文件及目录,包括隐藏文件(开头为 . 的文件)也一起罗列出来,这是最常用的选项之一。
拿 -l
举个例子:
补充:ll
和 ls -l
的效果是一样的,可以理解为简写或者别名
root@ubuntu:/usr# ls -l
total 92
drwxr-xr-x 2 root root 49152 Apr 21 07:17 bin
drwxr-xr-x 2 root root 4096 Jul 24 2018 games
drwxr-xr-x 34 root root 4096 Apr 15 06:53 include
drwxr-xr-x 131 root root 4096 Apr 17 02:15 lib
drwxr-xr-x 10 root root 4096 Jul 24 2018 local
drwxr-xr-x 2 root root 12288 Apr 17 02:20 sbin
drwxr-xr-x 246 root root 12288 Apr 17 02:16 share
drwxr-xr-x 6 root root 4096 Apr 21 07:17 src
前面看到了使用 cd -l
使得目录下的内容通过长格式显示出了结果,而这种格式包含着很多的有用信息,简单看一下它提供了哪些
文件类型:“-”代表普通文件,d 表示目录
基本用法:mkdir [参数] 目录名称
-m<目录属性>
或—mode<目录属性> :建立目录的同时设置目录的权限,而不是采用默认目录权限-m
权限为777-p
或--parents
:若上层目录没有建立,则递归帮你创建上层目录权限的问题我们仍不多考虑,放到后面,这里分别演示一下无参数创建以及递归创建
root@ubuntu:~# mkdir ideal-20
root@ubuntu:~# cd ideal-20
root@ubuntu:~/ideal-20# mkdir -p a/b
root@ubuntu:~/ideal-20# cd a
root@ubuntu:~/ideal-20/a# cd b
root@ubuntu:~/ideal-20/a/b# pwd
/root/ideal-20/a/b
基本用法:rmdir [选项] [目录]
-p
:递归删除目录,当子目录删除其父目录为空时,也一同删除-v
:输出处理的目录详情演示:
root@ubuntu:~/ideal-20/a/b# rmdir /root/ideal-20/a/b
如果目录不为空就会报错
rmdir: failed to remove '/root/ideal-20': Directory not empty
创建好了目录,就可以开始试着创建文件了,touch 可以帮助我们创建文件,也可以修改目录的时间参数
基本用法:touch 文件名称
如果文件不存在,不建立任何文件,也不提示
比较用的多一点的就是简单的文件创建了
root@ubuntu:~# touch demo.txt
root@ubuntu:~# ls
demo.txt
指定修改时间 也给出一下格式
touch -d "20200423 10:11" test.txt
cp 命令,主要用来复制文件和目录
基本用法:cp [选项] 源文件 目标文件
复制文件和目录以及属性(包括所有权和权限)
root@ubuntu:~# cp demo.txt /var/
cp -i
root@ubuntu:/var# cp /root/demo.txt /var/test.txt
root@ubuntu:/var# cp -r /var/ideal/ /root/
root@ubuntu:/var# cp -r /var/ideal/* /root/
rm 命令用来删除文件和目录,同时默认情况下不会有任何的提示
基本用法:rm[选项] 文件或目录
系统将不再询问,而是直接删除目标文件或目录
这个方法使用要特别小心,Linux 可是没有还原操作的,它默认认为用户是明智的,尤其搭配通配符进行删除的时候,一定要小心,可以提前使用 ls 命令看一下要删除的内容是不是自己想要的
下面两行命令分别就是删除文件和删除目录的简单演示
root@ubuntu:/var# rm test.txt
root@ubuntu:/var# rm -r /var/ideal/
基本用法:mv [参数] [源文件或目录] [目标文件或目录]
若需覆盖文件,则覆盖前先进行备份
将 /root/demo.txt
文件移动到根目录 /
root@ubuntu:~# mv /root/demo.txt /
将 /root/demo.txt
文件移动到根目录 /
,并重命名为 test.txt
root@ubuntu:~# mv /root/demo.txt /test.txt
移动/root/ideal目录中的所有文件和子目录到根目录
root@ubuntu:~# mv /root/ideal /
将 demo 文件重命名为 demo2 ,将 ideal 目录重命名为 ideal2
root@ubuntu:~# mv /root/demo /root/demo2
root@ubuntu:~# mv /root/ideal /root/ideal2
基本用法:ln [选项] 源文件 目标文件
如果目标文件已经存在,则删除目标文件后再建立链接文件
Linux 链接概念 Linux 链接分两种,一种被称为硬链接(Hard Link),另一种被称为符号链接(Symbolic Link)。默认情况下,ln 命令产生硬链接。 硬连接 硬连接指通过索引节点来进行连接。在 Linux 的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为索引节点号(Inode Index)。在 Linux 中,多个文件名指向同一索引节点是存在的。比如:A 是 B 的硬链接(A 和 B 都是文件名),则 A 的目录项中的 inode 节点号与 B 的目录项中的 inode 节点号相同,即一个 inode 节点对应两个不同的文件名,两个文件名指向同一个文件,A 和 B 对文件系统来说是完全平等的。删除其中任何一个都不会影响另外一个的访问。 硬连接的作用是允许一个文件拥有多个有效路径名,这样用户就可以建立硬连接到重要文件,以防止“误删”的功能。其原因如上所述,因为对应该目录的索引节点有一个以上的连接。只删除一个连接并不影响索引节点本身和其它的连接,只有当最后一个连接被删除后,文件的数据块及目录的连接才会被释放。也就是说,文件真正删除的条件是与之相关的所有硬连接文件均被删除。 软连接 另外一种连接称之为符号连接(Symbolic Link),也叫软连接。软链接文件有类似于 Windows 的快捷方式。它实际上是一个特殊的文件。在符号连接中,文件实际上是一个文本文件,其中包含的有另一文件的位置信息。比如:A 是 B 的软链接(A 和 B 都是文件名),A 的目录项中的 inode 节点号与 B 的目录项中的 inode 节点号不相同,A 和 B 指向的是两个不同的 inode,继而指向两块不同的数据块。但是 A 的数据块中存放的只是 B 的路径名(可以根据这个找到 B 的目录项)。A 和 B 之间是“主从”关系,如果 B 被删除了,A 仍然存在(因为两个是不同的文件),但指向的是一个无效的链接。
使用 cat 命令可以显示文本文件的内容,其后可以直接跟文件名
同时 cat 也可以把几个文件内容附加到另一个文件中,即连接合并文件
基本用法:cat [参数] [文件]
显示所有的内容,包括特殊字符
选个长度小点的演示,别的大家亲手试一试就好了
root@ubuntu:/etc# cat -n issue
1 Ubuntu 18.04.1 LTS \n \l
2
补充:cat 是从第一行开始显示,而有一个命令 tac 则是从最后一行开始显示
上面的演示是一个很短的文件,但是由于 cat
命令是直接将内容一次性输出到屏幕上,但是如果内容过多,查看起来就会非常的麻烦,因为信息会在屏幕上快速的滚动,对于长篇的文本内容,更推荐使用more命令来查看,同时它在下面会以百分比的形式告诉你已经读了多少
基本用法:more [选项] 文件名
除了特殊需要,一般也不加什么参数,下面的大概了解下就好了
计算行数时,以实际的行数,而不是自动换行过后的行数。
more 命令的执行会打开一个可以交互的界面,所以了解下面一些交互的指令还是必要的
交互指令 | 功能 |
---|---|
h 或 ? | 显示 more 命令交互命令帮助。 |
q 或 Q | 退出 more。 |
v | 在当前行启动一个编辑器。 |
:f | 显示当前文件的文件名和行号。 |
!<命令> 或 :!<命令> | 在子Shell中执行指定命令。 |
回车键 | 向下移动一行。 |
空格键 | 向下移动一页。 |
Ctrl+l | 刷新屏幕。 |
= | 显示当前行的行号 |
' | 转到上一次搜索开始的地方 |
Ctrf+f | 向下滚动一页。 |
. | 重复上次输入的命令 |
/ 字符串 | 搜索指定的字符串 |
d | 向下移动半页 |
b | 向上移动一页 |
这个命令的应用场景就是当你不想要看完整个文档,直线看前N行,就可以使用它
基本用法:head [选项] 文件名
以及 tail [选项] 文件名
选项 | 含义 |
---|---|
-n K | 这里的 K 表示行数,该选项用来显示文件前 K 行的内容; |
-c K | 这里的 K 表示字节数,该选项用来显示文件前 K 个字节的内容 |
-v | 显示文件名 |
(2) 和 (3) 都比较简单,就不演示了
less命令和more命令功能基本差不多,也是分屏的显示方式,同时支持 more 命令的所有参数,同时还多了一些选项,例如支持使用上下键翻页,总的来说,它更加的全面以及完善
基本用法:less [选项] 文件名
选项暂时用的也不多,暂时搁着,以后有需要查就是了,下面的交互指令,了解一下就好了,把常用的例如上下页这种记住就可以了
交互指令 | 功能 |
---|---|
/字符串 | 向下搜索“字符串”的功能。 |
?字符串 | 向上搜索“字符串”的功能。 |
n | 重复*前一个搜索(与 / 成 ? 有关)。 |
N | 反向重复前一个搜索(与 / 或 ? 有关)。 |
b | 向上移动一页。 |
d | 向下移动半页。 |
h 或 H | 显示帮助界面。 |
q 或 Q | 退出 less 命令。 |
y | 向上移动一行。 |
空格键 | 向下移动一页。 |
回车键 | 向下移动一行。 |
【PgDn】键 | 向下移动一页。 |
【PgUp】键 | 向上移动一页。 |
Ctrl+f | 向下移动一页。 |
Ctrl+b | 向上移动一页。 |
Ctrl+d | 向下移动一页。 |
Ctrl+u | 向上移动半页。 |
j | 向下移动一行。 |
k | 向上移动一行。 |
G | 移动至最后一行。 |
g | 移动到第一行。 |
ZZ | 退出 less 命令。 |
v | 使用配置的编辑器编辑当前文件。 |
[ | 移动到本文档的上一个节点。 |
] | 移动到本文档的下一个节点。 |
p | 移动到同级的上一个节点。 |
u | 向上移动半页。 |
这几个查看文本的命令用几句话总结一下
在网络上,人们自然是更倾向于传输经过压缩后的文件,由于其体积小,所以传输时间得以缩短,下面我们就来了解一下 Linux 针对文件压缩等的概念
在 Windows 下,我们通常会借用一些第三方的压缩软件,例如 WinRAR Bandizip 进行文件的压缩,常见的格式 也就是 .rar .zip .7z
等,而同样 Linux 也有着它压缩的方式与一些格式,在 Linux 中,在压缩之前,通常还有一个打包的操作,我们首先来了解一下这两个概念
① 打包,也称为归档,是将一个文件或者目录的集合存储在一个文件中,打包后的文件没有经过压缩,因此它占用的空间是其中所有文件目录的总和
② 压缩的原理就是将文件中相同的信息用一个字符代替,文件体积就能变小,压缩对于文本或者数据类文件有比较明显的作用
下面看一下具体的用法
基本用法:tar [选项] 源文件或目录
同时由于打包(归档)后的包文件都是 .tar
结尾所以,又叫做 tar 包
将多个文件或目录进行打包。
注意哈,使用 tar 命令指定选项时可以不在选项前面输入“-”,输不输入都一样的
演示下,首先 root 目录下有 demo.txt 文件以及 test 目录,这三种情况就分别代表了,打包文件、目录,以及同事打包多者
root@ubuntu:~# tar -cvf demo.txt.tar demo.txt
demo.txt
root@ubuntu:~# tar -cvf test.tar test
test/
root@ubuntu:~# tar -cvf demo-test.tar demo.txt test
demo.txt
test/
查看一下结果
root@ubuntu:~# ls
demo-test.tar demo.txt demo.txt.tar test test.tar
如果想要进而对其压缩,就可以执行下面的命令,暂时先看看,别急,这种方式有点麻烦,能更加优化的
这样 文件就加上了 .gz
后缀了,这是一种压缩格式,后面再细说
root@ubuntu:~# gzip demo.txt.tar
root@ubuntu:~# ls
demo-test.tar demo.txt demo.txt.tar.gz test test.tar
基本用法:tar [选项] 压缩包
对 tar 包做解打包操作。
其实与打包区别是不大的,只不过把 -cvf
替换成了 -xvf
root@ubuntu:~# tar -xvf demo.txt.tar
前者是默认解压在当前目录的,如果想要指定目录解压,需要使用 -C
选项,例如下面解压到 usr 目录下
root@ubuntu:~# tar -xvf demo.txt.tar -C /usr
如果想看一下包中有哪些文件,可以 将 -x
替换成 -t
选项
root@ubuntu:~# tar -tvf test.tar
上面虽然演示了一下打包后,再进行压缩的一个例子,但是这也太麻烦了吧,打包压缩,需要先打包成 .tar
再压缩成 .tar.gz
别急阿,前面演示,是为了让大家分的更清楚一点,自然是有着更加方便的操作方式,下面来看一下
基本用法:tar [选项] 压缩包 源文件或目录
常用的有两种:
① .tar.gz 方式
root@ubuntu:~# tar -zcvf demo.txt.tar.gz demo.txt
root@ubuntu:~# tar -zxvf demo.txt.tar.gz
② -jcvf 方式
这个的区别就是把上面的 -zcvf
换成了 -jcvf
也就是 -z
变成了 -j
root@ubuntu:~# tar -jcvf demo.txt.tar.gz demo.txt
root@ubuntu:~# tar -jxvf demo.txt.tar.gz
同时上面说的, -C
用于指定解压位置、-t
用于查看压缩包内容,也是一样的哈
总结:一般来说,.tar.gz
和 .tar.bz2
是比较常用的,后面这两种直接打包压缩 解压缩的方式要记好了
这一篇文章,也是除了安装,以及配置网络,环境以外,关于 Linux 的第一篇,这一篇主要讲解了关于 Linux 的常用命令,当然了,都是一些比较基础的,原本 vi/vim 也想放到这里,但是现在已经1w字左右了,篇幅太长,给大家查阅起来也不是很方便,就挪到下一篇说,虽然说我暂时没想着把 Linux 学到多么深的一个层次,不过即使作为基础认识,还有一些例如用户、还有权限等等的问题也没有说到,后面我会再出几篇文章说一下
写这篇文章,主要原因还是因为自己欠缺这方面的知识,顺便当总结,也同样分享给大家一起交流,当然啦,这篇文章都是一些入门的基础操作,没什么难度可言,也渴望与大家交流
感谢大家的支持,谢谢!