**shell
**就是命令解析器。命令解析器的作用是对用户输入到终端的命令进行解析,调用相应的执行程序。
当我们在终端输入命令的时候,由shell
命令解析器对命令按照$PATH
环境变量搜索命令进行解析,解析成内核能够识别的指令,然后内核再执行命令,最后将执行的结果由终端显示给用户。如果shell
在$PATH
环境变量中找不到对应的命令,就会报错。我们可以通过echo $PATH
查看环境变量的值。
例如此处就查看了本机的环境变量。Linux的系统结构如下:
可以从图中看到shell
是位于应用层与内核层之间的。我们常用的命令解析器有sh
和bash
。查看当前系统使用的shell
可以使用echo $SHELL
。查看系统下可以使用的shell
可以使用cat /etc/shells
。
在Linux中,我们会经常使用TAB
键,该键可以帮我们补全命令以及补全文件名(包括目录和文件)。在补全的时候,如果后续对应的命令或者文件有多个,则按下TAB
键之后会显示后续可以补全的所有内容。使用TAB
可以减少用户的输入,加快输入的速度,减少出错的机会。但是在sh
中该功能会失效,TAB
键依然会以制表符的形式进行输出,不会自动补全。
快捷键 | 功能 |
---|---|
ctrl + p 或者 ↑ | 上一条命令 |
ctrl + n 或者 ↓ | 下一条命令 |
ctrl + b 或者 ← | 光标左移 |
ctrl + f 或者 → | 光标右移 |
ctrl + a 或者 home | 光标移动到头部 |
ctrl + e 或者 end | 光标移动到尾部 |
ctrl + h 或者 Backspace | 删除前边字符 |
ctrl + d | 删除后边字符 |
ctrl + u | 删除光标前所有内容 |
ctrl + k | 删除光标后所有内容 |
Linux和Windows不一样,Windows的文件管理系统是分为一个又一个的盘符,而在Linux中,文件系统都是从根目录开始,结构像一棵树,根目录用/
表示。如下面就是一个Linux的文件系统。
接下来说一下关于Linux中主要的一些目录。
/bin
: binary,二进制文件,存放可执行程序,shell命令。如ls、rm、mv、cp等。/sbin
:存放系统管理员使用的系统管理程序。如ifconfig、shutdown等系统命令。/dev
:存放设备文件。在Linux下一切皆文件,所以硬盘、显卡、显示器等都是以文件的形式存储的。如在input
目录下执行sudo cat mouse0
移动鼠标会显示有输入。/lib
:Linux运行的时候需要加载的一些动态库。/mnt
:手动挂载的目录。/media
:外设自动挂载的目录。/root
:Linux超级管理员root
的家目录。/usr
:类似于Windows中的program files
的目录。其中include
目录中存放的是一些头文件,比如stdio.h、stdlib.h等,games
目录中存放的是一些小游戏。/etc
:存放配置文件。
/etc/passwd
:使用man 5 passwd
可以查看passwd
文件的格式信息。/etc/group
:使用man 5 group
可以查看group
文件的格式信息。/etc/profile
:系统的配置文件,修改该文件会影响这个系统下的所有的用户。/opt
:安装的第三方应用程序,比如Oracle数据库等。/home
:Linux操作系统下所有用户的家目录,用户的家目录也成为宿主目录或者主目录。/tmp
:存放临时文件,新建在此目录的文件会在系统重启之后自动清除。在文件系统中,我们需要理解什么是相对路径,什么是绝对路径。绝对路径是从根目录开始的路径,如下面使用pwd
输出的当前工作路径就是相对路径。
相对路径是从当前路径开始表示的路径。.
表示当前路径、..
表示当前路径的上一级路径。在Linux命令提示符中,如上面绝对路径的图中。ht
表示当前登录的用户,@
表示在的意思,也就是英语中的at
。HT
是主机名,主机名在/etc/hosts
这个文件中。其中~/zoo
表示的是当前的工作目录,~
表示宿主目录(家目录或者主目录),通过echo ~
或者echo $HOME
查看当前用户的宿主目录。
其中$
表示当前用户为普通用户,#
表示当前用户为root
用户。
tree
以树状形式查看指定目录,使用该命令需要安装软件tree
,安装命令如下:
sudo apt-get update
sudo apt-get install tree
tree
的使用如下:
tree #以树状结构显示当前目录下的文件
tree dir #以树状结构显示指定目录下的文件信息
需要注意的是tree
只能查看目录内容,不能查看普通文件内容。
ls
该命令可以查看指定目录下的文件信息,使用方法为:
ls #显示当前目录下文件信息
ls dir #显示指定目录下的文件信息
ls file #显示指定文件信息
-l
:列出文件的详细信息。
上面显示的内容一共有7部分,首先第1个字符表示的是文件的类型。文件的类型有以下:
-
:普通文件d
:目录文件l
:符号链接文件,相当于Windows中的快捷方式s
:套接字文件p
:管道文件b
:块设备文件c
:字符设备文件在后续紧跟着的9个字符表示的是用户的操作权限,也就是第2~10个字符,其中三个三个为一组。前三个字符表示文件所有者对文件的操作权限,中间三个字符表示文件所属组用户对文件的操作权限,最后三个字符表示其它人对文件的操作权限。这里的r
表示读权限,w
表示写权限,x
表示执行权限。如果对应的位置是-
,表示没有该对应的权限。如wrx-rx--x
表示的是文件所有者可读可写可执行,文件所属组的用户权限是可读可执行但是不能写,其他用户的权限是只能执行不可读写。
用户权限的字符后面跟着的数字表示的是硬链接计数。对于目录来说,硬链接计数等于该目录下的所有目录的总数,包含了.
和..
。所以空目录的硬链接计数是2。对于文件来说,这个计数就是该文件的所有的硬链接文件数量,当一个文件的硬链接计数的数量变成了0,也就代表该文件被彻底删除了。
后面的两个表示文件的所有者和文件的所属组,比如上面查看的文件的所属者就是ht
,文件的所属组就是HT
。文件的所有者并不代表就是文件的创建者。
后面的数字表示的是文件的大小。对于目录来说只代表目录的大小,并不包含目录中的内容,目录的大小为4k
。如果是文件则是文件的大小。
最后的日期是文件的创建日期或者是文件最后修改时间。日期后紧跟着的是文件名。
上述的参数也可以进行组合,如下:
cd
该命令的功能是切换文件目录,使用方式是
cd dir #切换到指定路径
其中路径dir
可以是相对路径也可以是绝对路径。切换到家目录可以使用以下命令:
cd
cd ~
cd /home/用户名
cd $HOME
pwd
查看用户当前所处的工作目录。
which
该命令用于查看命令所在的目录。用法为which 命令
touch
创建文件。如果文件存在,则更新文件的最后修改时间。用法为touch file
mkdir
创建目录,用法为mkdir dir
。需要创建多层目录需要使用参数-p
。
rmdir
删除空目录,用法为rmdir dir
。
rm
可以用于删除文件,也可以用于删除目录。用法为rm file
或者rm -r dir
。其中有一些参数如下:
-r
:递归删除目录,删除目录必须添加此参数。-i
:提示用户是否删除文件或者目录。-f
:强制删除,当文件不存在的时候也不会提醒。cp
用于拷贝文件。使用方法为cp dir1/file1 dir2/file2
,如果需要对目录进行拷贝,则需要使用-r
参数。关于cp
有以下一些情况。
cp file1 file2(不存在)
:则创建file2
,将file1
的内容拷贝到file2
。cp file1 file2
:file1
的内容覆盖到file2
。cp file dir
:将file
拷贝到dir
目录中。cp -r dir1 dir2
:将dir1
目录拷贝到dir2
中,包括dir1
目录。cp -r dir1 dir2(不存在)
:创建dir2
,将dir1
中的内容拷贝到dir2
中,但是不包括dir1
目录。在拷贝的过程中也可以添加-a
参数,这样可以保留拷贝文件中的一些属性信息。
mv
该命令的作用有两个,一个是重命名,一个是移动。当移动的时候第二个参数一定是目录文件。用法为mv file/dir file/dir
。
cat
用于将文件内容一次性输出到终端。用法为cat 文件名
。缺点是文件内容如果太长会无法全部显示,可以结合we年的重定向。比如cat file1 > file2
相当于是cp file1 file2
。
more
将文件内容分页显示到终端,但是只能一直向下游览,不能回退。使用方法为more file
。相关操作为回车显示下一行,空格显示下一页,退出可以使用q
或者ctrl+ c
。
less
将文件分页显示到终端,可以自由上下游览。使用方法为less file
。相关操作为:
操作 | 方法 |
---|---|
显示下一行 | 回车、ctrl + p 、↓ |
显示上一行 | ctrl + n 、↑ |
显示下一页 | 空格、PageDown |
显示上一页 | PageUp |
退出 | q |
head
用于查看文件的前几行内容,默认是10行内容。如果需要指定行数可以加参数-数字
就能显示指定前几行。用法为head file
。
tail
用于查看文件的最后几行的内容,使用方法和head
是一样的。
软链接相当于Windows下的快捷方式。创建方法为ln -s file/dir link
。需要注意的是ln
创建的链接需要使用绝对路径进行创建,因为如果不使用绝对路径进行创建的话一旦链接的位置发生了变化则就不能找到那个文件了。软链接文件的大小是路径加上文件名的总字节数。
硬链接相当于是给一个文件起了另一个名字。硬链接的创建方式为ln file link
。硬链接需要注意的是不能建在目录上。硬链接对绝对路径没有要求。硬链接不能跨域文件系统,因为硬链接中的inode
是一样的,而跨越了文件系统可能会导致inode
不一致。硬链接的本质就是不同文件名所在的inode
节点是相同的,相同的inode
节点指向了相同的数据块,所有他们的文件内容都是一样的,文件内容也会进行同步。我们可以使用ls -i file
来查看文件的inode
节点,也可以使用stat file
查看。
硬链接不仅可以起到同步文件的作用,还可以起到保护文件的作用。当删除文件的时候文件的硬链接计数只要不为0,那么文件就不会被删除。
wc
用于显示文件行数,字节数和单词数。使用方法为wc file
。其中有一些可选参数,-c
表示统计总字节数,-l
表示统计总行数,-w
统计总单词数。
whoami
用于显示当前登录的用户名。
chmod
Linux是通过权限来对文件进行访问控制的。chmod
可以修改文件的相关权限。
第一种方法是文字设定法chmod [who] [+-=][mod] file
。其中[who]
表示操作的对象,a
表示所有用户(默认),u
表示用户,g
表示同组用户,o
表示其他用户。操作符[+-=]
分别表示添加、取消、赋予给定权限取消其他权限。权限mod
中有r
为读权限,w
为写权限,x
为执行权限。
第二种方法为数字设定法。用法为chmod [+-=][mod] file
。其中操作符与文字设定法是一样的。而[mod]
则需要用三位数字,其中0
表示没有权限,1
表示执行权限,2
表示写权限,4
表示读权限。三位数字分别表示用户、同组用户以及其他用户。
chown
chown
的作用是修改文件所有者以及修改文件的所属组。修改文件的所有者的方法为chown user file
。修改文件所有者以及所属组为chown user.group file
或者chown user:group file
。
chgrp
该命令是用于修改文件所属组。修改的方法为chgrp group file/dir
。
find
该命令主要用于查找文件,查找的格式为find path condition
。
按文件类型查询:-type typename
。完整的命令是find path -type typename
。其中typename
有其中,分别是普通文件f
,目录文件d
,符号连接文件l
,块设备文件b
,字符设备文件c
,套接字文件s
,管道文件p
。
按照文件大小查询:-size
。完整的命令为find path -size scope
。其中+
表示大于,-
表示小于,不添加任何则表示等于。在大小的时候M
必须要大写,k
必须要小写,c
表示字节数。
按文件日期查询:
按深度查询:-maxdepth n
和-mindepth n
。
除了上面的内容外,还有一些高级的查询。如:find path condition -exec shellCommand {} \;
,可以将查询得到的结果交给后面的command
执行。例如查找指定目录下所有目录并且列出目录中文件的详细信息为find . -type d -exec | ls -l {} \;
。第二个是find path condition -ok shellCommand {} \;
,但是在执行的时候会让你进行是否确定。例如find . -type d -ok ls -l {} \;
。第三个是find path condition | xargs shellCommand
。这个的用途和第一个命令一样。例如实现上面同样的功能为find . -type d | xargs ls -l
。
grep
该命令可以用于对于文件的内容进行查找,用法为grep arguments string
。参数如下:
-r
: 如果是目录,则可以递归进行搜索。-n
:显示查找内容所在的行号。-i
:可以忽略大小写进行查找。-v
:不显示含有的字符串。首先我们需要了解一下gzip
和bzip2
。在Linux中这两个不能压缩目录,只能一个一个文件进行压缩,压缩之后会使原文件消失。
gzip *
:压缩当前目录下所有的文件,但是目录不能压缩。gunzip *
:解压当前目录下所有的.gz
文件。bzip2 *
:压缩当前目录下所有的文件,但是目录不能压缩。bunzip2 *
:压缩当前目录下所有的.bz2
文件。在压缩工具中,tar
是很重要的。现在说一下关于tar
命令中的一些参数。
z
:用gzip
来压缩或者解压文件。j
:用bzip2
来压缩或者解压文件。c
:用于创建新的压缩文件,与x
互斥使用。x
:从压缩文件中释放文件,与c
互斥使用。v
:详细报告tar
处理的文件信息。f
:指定压缩文件的名字。t
:查看压缩包中有哪些文件。压缩的命令如下:
tar cvf 压缩包名.tar 文件/目录
tar zcvf 压缩包名.tar.gz 文件/目录
tar jcvf 压缩包名.tar.bz2 文件/目录
解压缩命令如下:
tar xvf 压缩包名
tar zxvf 压缩包名
tar jxvf 压缩包名
查看压缩包中有哪些文件
tar -tvf 压缩包名
接下来说一下关于rar
工具和zip
工具。
rar
压缩命令:rar a -r 压缩包名 需要压缩的文件
rar
解压缩命令:rar x 压缩包名
zip
压缩命令:zip -r 压缩包名 需要压缩的文件
zip
解压缩命令:unzip 压缩包名 -d 解压目录
软件安装:sudo apt-get install 软件名
软件卸载:sudo apt-get remove 软件名
更新软件列表:sudo apt-get update
清理安装包:sudo apt-get clean
。清理的路径是/var/cache/apt/archives
。
安装deb
格式的安装包,安装时候必须要先有对应格式的安装包。
安装命令为sudo dpkg -i 软件名.deb
,卸载为sudo dpkg -r 软件名
。