Linux操作系统基础解析之——基本操作及获得帮助

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux操作系统基础解析之——基本操作及获得帮助相关的知识,希望对你有一定的参考价值。


  我们传统意义上理解的操作系统实际上是指:包括了操作系统的kernel,以及在其上构建了大量的功能各异的应用程序的集合体。所以狭义上来讲,操作系统就是指kernel。kernel将底层的硬件的复杂逻辑屏蔽掉,将硬件虚拟化为更加容易使用和访问的资源,向上层的应用程序提供调用接口,从而可以保证应用程序能够正常运行,能够访问和使用硬件资源。在这些应用程序中,有一类应用程序是非常特殊的,它是操作者使用计算机的入口,是操作者完成交互式登录以及交互式作业的基础,这种应用程序我们称之为接口程序,或者叫用户访问界面程序。


  对于Linux系统而言,可以有多种选择,即:

    GUI:图形用户接口,也就是我们常说的图形界面

    CLI:命令行接口,也就是我们常说的文本界面或者叫字符界面


  在企业的生产环境中,为了能够让服务器以更多的资源为客户提供服务,也为了加快服务器的配置管理速度,大多数的时候,我们都会选择文本界面来进行命令操作的执行。接下来就来讨论一下,Linux系统的一些基本特征和使用规则。


首先大家必须要理解的就是Linux的哲学思想:

  1、一切皆文件,Linux把几乎所有资源都抽象为文件形式来保存和使用,这样做的好处就是将复杂的数据管理简单化、具体化;

        

  2、由众多功能单一的程序组成,每个小程序功能单一,通常只做一件事,但必须做好;组合小程序完成复杂任务;

      

  3、尽量避免与用户交互,易于以编程的方式实现自动化任务;

    

  4、使用纯文本文件保存程序的配置信息;


那么文件是什么?

  对于Linux系统而言,如果我们有很多文件,应该如何有效组织?

  假如我们有一个存放货物的仓库,货物如何摆放才能更节省空间?货物如何摆放才能在我们需要的时候能够立即找到?

  我们需要做的第一件事就是,考虑该要尽可能合理的规划出这些货物的存放方式。

  通常来讲有两种方式:平面化和层次化。

    从上述例子的角度来说,平面化管理是指将所有的货物放在同一种组织架构下,他们之间是平级的。由于所有货物都在同一平面结构下,想要找到符合要求的货物只有一个方法——遍历。如果足够幸运,可能第一个就是我们要找的;如果足够不幸,可能直到最后一个才找到。而平均起来的话,就是查找一半。

    层次化管理是指根据我们存放的货物的某一特性或某些特性,将待这些货物进行分类,每个分类中可以继续根据特性进行二次分类,以此类推,可以实现非常鲜明的结构分层,这样有助于信息快速检索。比如将这些货物,但是可能有诸多的分类标准,可以按照体积进行划分,可以按照重量进行划分,可以按照使用方式来进行划分,还可以保质期限进行划分,等等。总之有很多的分类标准,我们从中选择出我们需要的分类标准实现分类即可。而这种分类的好处就在于:可以逐级的缩小查找范围。


  计算机的外部存储设备中存放着大量的文件,按照特定的标准进行了层级划分,而基于层级的方式管理文件的机制,就称之为文件系统。也就是说文件系统是一种按照某种标准或规范来组织和管理计算机文件的层级结构。在文件系统中,通过目录来表示每个文件。目录的存在主要是为了实现路径映射。而文件就是磁盘上的一段有边界的流式数据,可以做到按名存取。


  这些文件都从属于唯一的一个原初起点——根,表示为"/",从而组织成了一个倒置的树形结构。所有的文件都从根起始,逐级逐层的找到目标文件。而在查找目标文件的过程中,所有经过的目录的层级结构连起来,就叫做路径。这个路径如果是从根开始的就叫做绝对路径;如果是从工作目录开始的,就叫相对路径。在整个路径中,只有最左侧的第一个"/"表示根目录,剩余的"/"只是路径中的目录分隔符,如:/dev/pts/0。


文件名使用法则:

  文件名的命名是基于某种文件系统而言的,在不同的文件系统中,文件的命名规范可能不同。在CentOS中,不同的发行版本使用的默认文件系统也不相同,如CentOS6系列默认使用ext4文件系统,而CentOS7系列默认使用xfs文件系统。而Windows中默认使用的是FAT或者NTFS文件系统。

  在Linux的ext4或xfs文件系统中,文件名有如下定义和使用的规则:

    1. 严格区分大小写(大小写敏感)

    2. 目录也是文件,在同一路径中,两个文件不能同名

    3. 文件名中可以是使用除"/"之外的任意字符

    4. 最长不能超过255个字符


  这些就是文件和文件系统的基本概念了。


  前面我们也说过了,一个完整的操作系统是由kernel+应用程序构成的。也就是说,除了kernel这个监控程序之外,用户所需要的功能都是有应用程序提供的。那么,一个标准的应用程序软件,应该包括哪些组成部分呢?

  通常来讲,在Linux中运行的应用程序软件包括以下四部分:

    1. 二进制文件

    2. 头、库文件

    3. 帮助文件

    4. 配置文件


下面我们来说一说用户是如何使用操作系统的。


在正式的开始使用操作系统之前,再和大家介绍几个基本的概念:

  宿主目录:也称为家目录。在完成了用户的创建之后,一般情况下,都会为每个用户创建一个目录,这是保存用户私密数据的场所,这就是家目录。家目录也是用户登录系统的起始目录,也就是说这个目录是用户登录之后开启的shell默认的工作目录。通常情况下,任何一个用户都可以在自己的家目录中创建文件以及管理这些文件。


  工作目录:指在完成某操作或者命令的运行的时候,shell所在的目录。


  任何文件的路径都有两部分组成,即:基名和文件名

  基名:就是这个文件自己的名字

  目录名:就是访问这个文件的路径中为了访问到指定文件而经过的所有的目录的累积名称

  如:

    /etc/sysconfig/network-scripts/ifcfg-eth0


    其中,ifcfg-eth0就是这个文件的基名,也就是这个文件真实的名字。

    /etc/sysconfig/network-scripts就是目录名,是为了找到这个文件所必须经过的目录的累积名称。


  有两个命令可以查看给定路径的基名和目录名:

    basename:取得给定文件路径的基名

    [[email protected] ~]# basename /etc/httpd/conf.d/welcome.conf
     welcome.conf

    dirname:取得给定文件路径的目录名

    [[email protected] ~]# dirname /etc/httpd/conf.d/welcome.conf
     /etc/httpd/conf.d/


  用户想要使用计算机,想要使用Linux操作系统来管理计算机资源,就必须要有一个被认证为合法的身份。这样的身份验证,是通过对用户提供的身份标识已经为了安全的使用这个身份标识而设置的密码。只有这些信息都是正确的,才会将用户接引进系统。之后就是根据用户的身份授予用户在系统中对于文件和数据的使用权力。


  每个用户在登录成功之后,系统都会为其启动一个默认shell,这个设定一般存放在/etc/passwd文件中;

  使用下述命令可以查看当前为用户正在使用的shell:

    [[email protected] ~]#  echo $SHELL
     /bin/bash


  这个/bin/bash就是众多的命令行接口中的一个,而且已经被列为标准来使用。而默认情况下,Linux会给每个用户都指定这个shell为其默认的shell。只要用户通过身份验证成功登录系统,就可以直接启动这个shell接口程序。也就是说,用户接下来的操作,都是在这个shell接口中进行的。


  好了,我们大概也注意到了,在登录成功之后,系统指挥返回这样一个有意思的字符串,如下所示:

  [[email protected] ~]# 

  上述这个东西我们称它为"命令提示符"。我们所有的命令都是在这个提示符之后完成的。在这个默认的命令提示符中,我们可以看到很多有意思的信息,我们可以把这个东西分成几部分来说明,即:root,localhost,~和#。

    root: 当前登录用户的登录名;

    localhost: 当前主机的非完整格式的主机名,一般是截取自第一个‘.‘之前;完整格式一般为FQDN,如果在安装系统的过程中,我们并没有设定过主机名的话,其默认值应为:localhost.localdomain;

    ~:shell程序所在的非完整格式路径的路径的基名,其实是一个目录名称,这个目录我们又称为叫shell的工作目录;而默认情况下,这个shell的工作目录就是登录用户自己的家。

    #:命令提示符号:

      #:管理员账户,即root用户;拥有至高权限,能在执行所有操作,几乎不会受到操作系统本身的限制,因此这个账户同时也是一个非常危险的账户,所以有关这个用户的身份信息必须要严格保密,都则将带来极为严重的后果;

      $:普通用户,即非root用户;不具有管理权限,不能执行管理类操作;

    注意:在生产环境中,建议使用非root账户登录Linux系统,如果有执行管理操作的需求,可临时切换至root账户(sudo, su均可),一旦操作完成应立即退出。


  如上所述命令提示符的内容,只是bash默认为用户提供的内容。我们常用的一些使用"\"定义的转义序列可以帮助我们实现更加丰富的命令提示符的内容。而这些内容都存放在bash的PS1变量中。查看默认情况下PS1变量中存储的转义序列,可以使用如下方式:

  [[email protected] ~]# echo $PS1
  [\[email protected]\h \W]\$


  比较常用的转义序列有:

    \d 使用"星期 月份 日期"的格式来显示系统时间,如:Wed May 18

    \h 直到第一个"."前面的主机名

    \H 完整的主机名

    \j 当前由shell所管理的后台进程(jobs)的数量

    \l 当前登录的shell的终端设备文件的路径的基名

    \s shell的名称,$0的基名

    \t 以HH:MM:SS格式标识24小时的时间

    \T 以HH:MM:SS格式标识12小时的时间

    \u 当前登录用户的用户名

    \w 当前工作目录的绝对路径表示方式

    \W 当前工作目录的绝对路径的基名

    \! 当前命令在历史命令列表中的编号

    \# 当前命令是本次登录以来所执行的第几条命令

    \$ 如果用户的有效UID是0,则显示为#;否则则显示为$


  通过这些转义序列的使用,能够让我们Linux的命令提示符更加丰富多彩。有兴趣的小伙伴可以尝试一下。


接下来来说一下命令的通用语法格式:

  [[email protected] ~]# 命令 选项 参数


  命令:

    指的是我们需要通过计算机完成的操作,比如管理文件,管理用户等。而shell程序是一种独特的程序,它可以查找并解析命令,向内核提交命令并将其运行为进程,解析路径,提供自动化运行命令的环境,等等。

 那么shell是如何解释命令,解析路径的呢?

    首先,值得注意的是,shell在执行一段命令之前,首先要根据特定的分隔符(默认为空白字符)将这个命令切分为若干部分。之后,shell会认为第一部分即使我们要执行的命令。后面的部分将被shell解释为选项或者参数。


    其次,当命令已经确定下了之后,shell为了要执行这个命令,必须确定这个命令的执行方式。因此,从命令的执行方式上来分类的话,可以将shell命令分为下述两类:

    1.内部命令(Shell builtin):

      由shell程序自带的命令,这些命令通常会随shell的加载而直接被加载进内存,因此在执行这类命令的时候,不需要进行磁盘IO,所以效率高,速度快;但是这类命名往往较少,而且每个内部命令都只是非常基础的命令。

    2.外部命令:

      独立存在于外部存储器中的可执行程序文件;大多数的应用程序所提供的功能,都要依靠相对于的外部命令来实现。

    命令通常都是可执行文件,所谓的可执行文件就是被赋予了执行权限的文件。但是,不是任何文件都能被赋予执行权限的,也不是被赋予了执行权限的文件都是可执行文件。这里面我们所说的可执行文件,主要指下列两类,即:

     二进制格式程序文件;

     脚本程序文件:需要由解释器解释运行;


    外部命令所对应的可执行的二进制文件大多存在于/bin或/sbin之类的目录中。在RHEL6和CentOS6中,这样的存放这类可以用于执行二进制问的目录是比较多的,如:/bin、/sbin、/usr/bin、/usr/sbin;而在RHEL7和CentOS7中,统一的将这些二进制文件放置在了/usr/bin、/usr/sbin目录中,但是为了保证根目录的一级子目录的格式的兼容,创建了/bin和/sbin两个符号链接,分别链接到刚刚的两个位置上。另外,如果需要通过编译源代码的方式来安装外部应用程序的时候,也有可能将可执行的二进制文件安装到/usr/local/bin、/usr/local/sbin中,还有在用户的宿主目录中也有可能存在~/bin的目录用于保存二进制文件。

    最后,如此之多的目录都可以用来保存可执行的二进制文件,那么shell该如何去查找这些外部命令对应的文件的路径的呢?其实,在shell中有一个内置名为PATH的环境变量,其内部保存了所有默认可用的二进制文件的存放路径,因此当shell发现可执行的命令不是内部命令而是外部命令的时候,就会到PATH变量中查找路径,然后依次查找每个路径中是否有对应的文件名,如果有,就执行之。但是如果每次执行外部命令都需要到PATH变量中去查找其对应的路径的话,未免效率过于低下,于是,shell引入了外部命令缓存的机制,所有已经被成功执行过的外部命令的路径都会暂时的缓存至内存中,非首次执行的命令直接从缓存中读取其路径信息即可。这个缓存的信息可以使用下列命令来查看:

    [[email protected] ~]# hash
    hits      command
   1        /sbin/ifconfig
   2        /bin/touch
   1        /bin/mkdir
   4        /bin/ls

         

那么我们要如何判断命令到底是内部的还是外部的?

 其实我们只需要一个简单的命令即可

 [[email protected] ~]# type  COMMAND

 这个命令的结果可以有如下几种情况:

  1. 如果被检测的命令是外部命令,则type会显示一条具体的路径,而这个路径正是通过PATH变量中存放的路径查找得到的;

  2. 如果被检测的命令是内部命令,则type命令会显示"COMMAND is shell buildin"的信息

  3. 当然还有可能是第三种情况,那就是为了方便用户的使用,可能把某个命令及其常用选择放在一起构建了一个别名命令,因此如果是这种情况的话,type命令会将别名命令以及原始的命令、选项以及参数的组合显示出来。

                

  选项:

    调整命令的运行特性。一般来讲,命令的执行结果都是比较简单的,而这样的结果有无法满足我们的需求,这个时候我们可以借助于选项来使得命令可以输出更加符合用户要求的执行结果。

    通常来讲,选项有两种形式:

     短选项: -CHAR,如, -l, -h, -d,... 大多数情况下,多个短选项可合并,如:-lhd相当于-l -h -d三个选项;

     长选项: --WORD,如, --long, --human-readable, ...绝大多数情况下,多个长选项之间必须使用空白字符间隔开,否则命令将无法正确识别这些长选项,从而报告错误信息。

  注意:

  1. 有些选项可以带参数,称为选项的参数;

  2. 一旦选择要携带参数,则选项和选项的参数必须相邻;

  3. 如果有多个选项都要携带参数,则这些选项无论长短,都不宜进行合并书写。

  4. 如果有的选项所带的参数中有诸如空白字符或者其他字符的话,这样的参数必须用引号引用才可以。如:

    [[email protected] ~]# ls -lhd /etc

    [[email protected] ~]# useradd -d /home/user1 -s /bin/bash -c ‘Network Manager‘ user1

          

  参数:

   命令的作用对象,根据命令的含义不同,参数可能是不同的对象。比如:路径(相对路径、绝对路径)、数字或数字组合、特定意义的字符串、甚至是某些具有特殊功能的特殊字符等;

   注意:

   1. 有的命令或选项可有多个参数,参数间使用空白字符分隔;

   2. 有的命令或选项只能写一个参数,如果写出多个参数企图一次执行的话,命令会报错;

   3. 有的命令或选项虽然只支持一个参数,但是我们可以把多个参数使用特定字符(如逗号)分隔开来,从而实现传递多个参数的目的。

      

  在使用Linux的过程中,我们可能会接触到很多的命令,但Linux命令太过繁多,有的命令也太过复杂,因此很多人都不可能做到任何一个命令都耳熟能详。因此,当我们遇到不会或者没用过的命令的时候,可以选择求助。当然,Linux已经想到了这个问题,因此给我们提供了很多种帮助方法和大量的帮助文档信息。


如何获取命令的使用帮助?

  方法一:使用帮助命令来获取帮助信息:

    内部命令:

      [[email protected] ~]# help COMMAND

      

    外部命令:

    1. 命令自带的简要格式的使用帮助,但这样的选项并不是每个命令都有的,使用时要多加注意;

      [[email protected] ~]# COMMAND  --help

    2. 使用man帮助手册(manual)

      默认情况下,我们使用软件包管理工具直接将已经编译好的应用程序的软件包安装到Linux系统中,在安装应用程序软件的时候,会同时安装这个软件所需要用到的帮助文件,默认的存储位置:/usr/share/man/

      在上述目录中,我们可以看到类似这样的目录:man1, man2, ..., man9,这些目录就是各种应用程序的不同类型的帮助文件的存放位置了,共计9章的内容。这些帮助文件都是采用压缩格式进行存放的,而查看这些信息的时候,调用less命令辅助显示,因此,操作上完全符合less命令的操作规范。具体操作如下:

       翻屏:

         Space, f:向文件尾部翻一屏;

         b:向文件首部翻一屏;

         d:向文件尾部翻半屏;

         u:向文件首部翻半屏;

         Enter:向文件尾部翻一行;

         y,k:向文件首部翻一行; 

         G:跳转至最后一行;

         #G:跳转至第#行;

            

       关键字搜索:

         /KEYWORD:向文件尾部搜索;

         ?KEYWORD:向文件首部搜索;

         n:与查找命令方向相同;

         N:与查找命令方向相反;

            

       退出:

         q:quit


    所谓的man的九个章节是保存了不同的帮助信息的。其所对应的具体内容是指:

     1.可执行程序或二进制命令

     2.系统调用(由内核提供的接口函数)

     3.C库调用(由程序库所提供的接口函数)

     4.特殊文件(通常指设备文件)

     5.配置文件的格式和约定规范

     6.游戏相关

     7.杂项(可能包含大量的软件包及其规范)

     8.系统管理命令(通常是只有root用户才能执行的命令) 

     9.内核程序[非标准]

         

    man的使用方法: 

      [[email protected] ~]# man [OPTIONS]... KEYWORD

        

    使用man命令之后。查看到的内容通常有着非常标准的格式和结构,每一份帮助文件中都被开发这分成了若干段的SECTION,其中主要包括:

     NAME: 名称及简要功能描述;

     SYNOPSIS:命令使用格式摘要;

     DESCRIPTION:详细描述信息;

     OPTIONS:选项详细说明;

     AUTHOR:作者

     BUGS:报告程序bug的途径;

     EXAMPLES:使用示例;

     SEE ALSO:额外参考

     FILES:相关的配置文件;

        

    其中的SYNOPSIS,明确的说明了概命令的使用格式和选项组合方式,我们通常能看到下述这几类特殊符号,他们的意义介绍如下:

     []:可选内容;

     {}:分组边界;

     <>:必须提供的内容;

     a|b|c:多选一;

     ...:同类内容可出现多次;

  注意:

  1. man命令会到很多路径下查找使用手册;这些路径是在/etc/man_db.conf(CentOS7)或/etc/man_config(CentOS6)文件中使用“MANPATH“指令定义的路径;

  2. 如果在配置文件中没有包括这个路径,我们又只是想临时的使用一次额外路径的话,可以使用下述命令:

   [[email protected] ~]# man  -M /PATH/TO/SOMEDIR  KEYWORD 

   该命令的意思就是:到指定路径下查找相关的KEYWORD的手册并输出显示出来;

          

  3) info COMMAND

    获取命令的在线文档;


  方法二:自带帮助文档

  很多应用程序在安装时会自带帮助文档,这些帮助文档会存放到/usr/share/doc/APPLICATION_NAME-VERSION/目录中,其中APPLICATION_NAME-VERSION是指应用程序文件名及其版本号。在这个目录中,以下文件通常非常有用:

    1.README:程序的相关信息;

    2.INSTALL:程序的安装帮助;

    3.CHANGES:版本迭代的更新信息;


  方法三:程序的主站上的文档

  如http://nginx.org站点的右侧导航栏中就会有这样的文档提供在线帮助:

    1.Document|Documentation

    2.wiki

    3.FAQ


  方法四:搜索引擎——Google

    keyword  filetype:TYPE

    keyword  site:DOMAIN.TLD  

本文出自 “运维者的家” 博客,请务必保留此出处http://zhaotianyu.blog.51cto.com/132212/1775669

以上是关于Linux操作系统基础解析之——基本操作及获得帮助的主要内容,如果未能解决你的问题,请参考以下文章

linux基础之基本命令

Linux操作系统基础解析之——Linux基本命令剖析

Linux操作系统基础解析之——Linux基本命令剖析

Linux操作系统基础解析之——Linux基本命令剖析

Linux操作系统基础解析之——bash基础知识和基本使用技巧

Linux操作系统基础解析之——文件系统层次结构标准(FHS)