燕姐的 Linux 私房菜之(1)—— Linux 简介

版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/gongxifacai_believe/article/details/85562568

1、操作系统与硬件

无论是 Linux、OS X、Windows 操作系统,他们都是由以下部分组成(分层结构):
最底层:硬件;
底层之上:将硬件的接口抽象成为系统调用(kernel);
再之上:库;
在此之上为:应用程序。
程序的运行可以有两种方式:
(1)开机自动启动运行;
(2)用户通过交互式接口登陆或者连接系统上去,来手动运行程序。
用户可以通过交互式接口对系统及其程序进行操作、配置管理。
系统的运行独立于用户的交互式接口,接口有无,都不影响系统及其程序的运行,所以交互式接口不是必须的,但是有些程序是建立在交互式接口之上的。
我们平时如果对系统进行控制,可以有这么几种方法:
(1)远程主机有电源线、网线(但没有键盘、显示器、鼠标等),我们可以通过远程连接进入;
(2)远程连入时,主机系统就必须提供一个可以远程接入进来的一个交互式接口,这个交互式接口的输出可以是本地的 vga 输入,也可以是显示到远程终端上去。

2、终端

终端,用户与主机交互,是必然用到的设备。
早期的大型主机,想使用的用户有很多,但主机只有一个,也不可能做到人手一台,但是可以做到在主机上接上一个分屏器,分屏器的每一个端子上可以接上一套键盘鼠标显示器,就可以直接在主机上面进行一些操作了,这就相当于每个人在独立的操作一台计算机一样,像这样我们把一个端子上面所接入的鼠标、键盘、显示器所组成的一个组合,我们就称之为终端。
所谓操作系统的多用户概念,就是基于此种模式而诞生的。终端可以说是一个程序,但严格意义上来讲是一个设备,因为终端所表现的是一些物理设备,如键盘、鼠标、显示器等。
我们可以通过终端来与操作系统或者主机进行交互,终端的类型也比较多,如
(1)物理终端:我们可以将显示器、键盘鼠标直接接在主机的接口之上,这样的终端称之为物理终端,即本机自带的,直接连入的,我们也称之为:物理控制台 console,表示为 /dev/console;
(2)虚拟终端:除了物理终端,系统会提供给我们 6 个虚拟终端,这些虚拟终端是附加在物理终端之上的,用软件方式虚拟实现的终端,CentOS 默认启用 6 个虚拟终端,可以通过使用快捷键来切换进来,切换方式:Ctrl-Alt-F[1-6],表示为 /dev/tty#;
在实际的操作中,系统启动之后我们都是通过虚拟终端1来登录,即便是在物理设备上,(那么什么时候用物理终端呢?是在系统开机启动的时候,服务还没有全部起来,这个时候映射的是物理终端,在服务完全启动之后映射的是虚拟终端1,当然还有图形终端)。
(3)图形终端:也是附加在物理终端之上,用软件方式虚拟实现的终端,但额外会提供桌面环境。也是虚拟终端的一种切换方式:Ctrl-Alt-F7。
(4)伪终端(模拟终端):图形界面下打开的命令行接口,还有基于 ssh 协议或 telnet 协议等远程打开的命令行界面。表示为:/dev/pts/#,查看当前的终端设备命令:tty。
终端实际上是一个设备,一个设备要想与系统进行交互,必须有交互接口,当我们开启一个终端时,系统会自动的在终端上运行(附加)一个交互式程序。
交互式程序有两类:GUI 和 CLI。
GUI:图形化界面,是基于 X 协议实现的窗口管理器(桌面、按钮的作用等)。
Linux桌面系统有:
(1)GNOME:C 程序开发,gtk 开发库;
(2)KDE:C++ 程序开发,qt 开发库;
(3)XFCE:轻量级桌面;
CLI:命令行界面,对应的叫 shell 程序,用户要想与系统交互,必须通过 shell,不同的程序员开发的程序不一样,但是都可以实现同样的功能(就是交互式功能),而且 shell 程序也有很多种,如:sh,csh,ksh,Bash,zsh。
如何获取当前环境使用的 shell 是哪种 shell:# echo $SHELL,显示当前系统使用的所有 shell:# cat /etc/shells

3、命令提示符

[root@localhost ~]#
[root@localhost ~] 我们称之为 PS1,靠环境变量定义,其组成部分可以使用 echo 命令来显示:echo $PS1,格式 [\u@\h \W]$
 # 表示命令提示符,提示符有两种:
(1)# 表示管理员登录;
(2)$ 表示普通用户登录。
因此可以通过命令提示符来判断是管理员登录还是普通用户登录。
所谓命令提示符,就是提示我们可以在此输入命令了,那么输入命令意味着什么?
输入命令,然后回车,提请 shell 程序找到键入的命令所对应的可执行程序或代码,并由其分析后提交给内核分配资源将其运行起来,表现为一个或多个进程。如:输入 ls,先查找 ls 对应的可执行程序:
 # which ls 可查看 ls 命令对应的可执行程序(也可以使用 whereis ls)
 # whereis ls 也可以获得 ls 有哪些帮助文件
有些命令是找不到其对应的可执行程序的,如 cd。
在 shell 中可执行的命令有两类:
(1)内建命令:由 shell 自带的,而且通过某命令形式提供;
(2)外部命令:在当前系统的某文件系统路径下有对应的可执行程序文件,可通过 which whereis 命令来查找到其可执行程序文件。
如何查看一个命令是内建命令还是外部命令:
通过 type 命令,格式:type COMMAND(注意,Linux严格区分大小写)。
运行命令:
命令格式:COMMAND [OPTIONS…][ARGUMENTS…]
选项:用于启用或关闭命令的某个或某些功能,如:ls 的 -l -h 选项;
短选项:如-c,多个短选项可合并使用;
长选项:–word,如 --long等。
参数:命令的作用对象(就是向命令提供数据的),命令的参数可以有多个。
注意:多选项,以及多参数和命令之间都应该使用空白字符分隔;取消命令执行:Ctrl-c。

4、文件系统

什么是文件系统?如查找一个名叫 magedu 的文件,怎么去查找?比如说系统只有一个 C 盘,首先要找到 C 盘,然后从 C 盘开始一层一层地查找直到找到 magedu 文件或者遍历所有文件,这个从最顶端开始一级一级地找到文件这样一种格式,称之为文件路径。
查找一个文件,如果运气好很快就能找到,否则可能就需要花费很长时间去查找。我们必须给一个具体的起始位置,然后会按照给定的起始位置去查找,如果给定的起始位置为根,我们称之为绝对起始位置。这就是文件系统的概念。
那么反映到我们的文件路径上来说是这样的:如 windows 上,C:\Program Files\office\word\word.exe,对 Linux 而言,/etc/sysconfig/network-scripts/ifcfg-eth0(最后一个节点叫做叶子节点,前面的称之为分叉节点(目录)),呈现倒状树型,所以查找文件就是从根开始一级一级找。
问:目录是什么?答:目录并非文件夹,而是路径映射。
问:文件是什么?答:首先文件得必须有名字,文件系统按名存储,文件名与文件内容没有关系,文件名是文件的外围属性,就比如人的名字一样。所以文件元数据就是由文件名、大小、属性这些外围属性所组成的。
文件有两类数据:元数据:metadata,文件名、大小属性等,如人的身高体重等;数据,data。比如书的文件索引信息就是元数据,而元数据所指向的那本书就相当于数据,目录也是一种文件,是一种特殊的文件。
Linux 文件系统的特性:
(1)文件名严格区分字符大小写;
(2)文件名可使用除了 / 以外的任意字符,但不建议使用特殊字符;
(3)文件名长度最长不能超过 255 个字符;
(4)所有 . 开头的文件都为隐藏文件;
继续上面提到的路径概念,路径在操作系统上分为两种:绝对路径和相对路径。绝对路径:从根目录起始的路径;相对路径:从当前位置起始的路径。当前位置:当前所处的位置,也称为工作目录,登录系统之后无时无刻都处在某个位置,可通过命令 pwd 来显示当前位置。
如何表示当前目录:
(1)./ ./sysconfig/network-scripts;
(2)或者省略上述 sysconfig/network-scripts;
(3)…表示当前目录的上一级目录。
无论是哪个 Linux 发行版都是以根为起始位置的,根下面都有这些一级子目录,并且这些目录的名称格式基本上都一样,这些内容都是由 LSB 来统一定义的。
Linux命令帮助的获取详解
首先此前说过命令的一个使用语法,也就是格式为:
COMMAND [OPTIONS…] [ARGUMENTS…]
在获取命令帮助信息时,内部命令和外部命令的获取方式是有区别的:
内部命令:help COMMAND
外部命令:有以下几种途径
(1)通过命令自带的帮助信息
COMMAND --help
COMMAND -h
(2)使用手册(manual)
man COMMAND
(3)信息页
info COMMAND:支持信息页中的超链接
(4)程序自身的帮助文档,有README、INSTALL、Changelog等
(5)程序的官方文档
(6)发行版的官方文档
(7)Google
内部命令帮助
help COMMAND
当前shell为bash,如果想要查看bash的帮助信息,可以通过man bash来查看,同时我们知道bash提供了很多个内部命令,如:cd、ls等,如果我们通过man cd来查看帮助信息会怎样?实际上查看到的是bash的帮助信息,因此我们内部命令不通过man来查看。
当我们执行一个命令的时候,系统会去找该命令的可执行文件,那怎么找呢,到哪里找呢?
当键入一个命令回车之后,系统会去特定的目录里面查找,这是一个专门的位置$PATH,先看下这个变量的值:# echo $PATH
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
注意:查找过程是有顺序的,自左向右,直到查找到为止,如果一个命令存在于多个路径中,他只匹配到第一个找到的路径,所以其先后次序是很关键的。
hash
hash的作用:hash就是记录或显示程序的位置(可执行程序的位置)。如果我们执行程序,系统每次都要从目录里面查找可执行文件,如果目录里面有很多可执行程序,那每次都需要花费很多时间去找文件,这就势必导致系统响应很慢,当然这也很不现实。实际中是只有第一次才去完整查找命令执行文件的,然后将其查询的结果记录下来放置到缓存中,如果下次还需要执行同样的命令,那么就直接从缓存中找命令的执行文件,然后直接执行。
这个缓存就是一个key/value的存储,可以通过hash命令来查看这个命令的缓存结果,这里的value就是命令的可执行文件的路径,key是一段hash码。
将一个命令移入到另一个目录里面来执行该命令,如:mv /bin/ls /usr/bin/ls,再执行ls命令,会发现系统找不到ls命令了。
hash的使用
通过内部命令获取帮助信息的方式来获取hash命令的使用方法:help hash
-d 表示清空指定的命令的缓存,如:hash -d ls
-r 表示清空所有命令的缓存,hash -r
history命令
history是管理命令历史,每次执行的命令都会放置在内存的缓存当中,直到退出当前终端后会被保存在命令历史文件当中。
查看命令历史:在家目录下面ls -a,有个隐藏文件.bash_history,可以通过查看该文件的内容来获取历史命令。
因此,命令的历史有两个存放位置:
(1)登录进shell后新执行的命令只会记录在缓存当中;
(2)登录shell时,会读取命令历史文件中记录的命令~/.bash_history;
history的使用选项:
-a:追加本次会话新执行的命令历史列表至历史文件中;
-d:删除历史命令中指定的命令;
-c:清空命令历史;
基于命令历史做的快捷操作:
假如我们想执行命令历史中的某条命令
(1)!n:执行命令历史中第n条命令;
(2)!string:调用历史中最近一个以string开头的命令
(3)!!:重复运行上一条命令;
(4)还可通过上下键来选择调用历史命令;
外部命令帮助:
(1)COMMAND --help
(2)man COMMAND:man帮助文档手册
手册页位置:/usr/share/man
man有8个章节:Man1–Man8
(3)Info命令的使用:info COMMAND
(4)程序自身的帮助文档:/usr/share/doc/command-version
(5)程序官方文档
(6)发行版官方文档
(7)Google
查询命令所属的章节:whatis COMMAND 或者 man -k COMMAND
man1:用户命令章节,所有用户都可以使用的;
man2:系统调用命令章节;
man3:C库调用;
man4:设备及特殊文件;
man5:配置文件的格式及相关参数;
man6:游戏;
man7:杂项;
man8:管理命令;
试想一下man命令怎么知道去哪里找呢?
其实man有自己的配置文件,会在配置文件里面定义man文档的路径,配置文件为:
CentOS 6:/etc/man.config;
CentOS 7:/etc/man_db.conf;
man -M /PATH/TO/SOMEWHERE COMMAND:到指定位置下搜索手册并显示之。
Man手册段落含义:
NAME:命令的名称及简要说明;
DESCRIPTION:命令功能的详细描述;
OPTIONS:所支持的选项的相关说明;
SYSNOPSIS:使用格式;
EXAMPLES:使用示例;
NOTES:相关注意事项;
FILES:相关的配置文件;
SEE ALSO:相关参考;
通过man命令获得命令的帮助信息页当中有一些用符号标记的内容,这些符号的意义是:
[]:可选内容;
<>:必选内容;
|:二选一;
…:同类内容可以有多个;
man命令的操作方法:
翻屏:使用空格或者上下箭头,或者PgUp、PgDn等来进行;
文本搜索等。

猜你喜欢

转载自blog.csdn.net/gongxifacai_believe/article/details/85562568