linux 基础知识点杂项-续

一、写在博文前的话以及linux哲学思想引言

1.1、引言部分

  想了很久不知道如何给这篇文章起一个什么名字,最终看到内容还是这么的凌乱,所以还是起了个"linux基础知识杂项记第二篇",由于我作为一个初学者文笔以及经验有限,以下部分的内容可能深入去研究,每一个层面可能不是一篇文章能说得清楚的,我的博文初级部分都是点到为止,写博文的目的不是为了告诉别人我学的好或者不好,为了培养自己的一个习惯。

1.2、unix哲学思想和准则

本小结内容摘自《Linux/Unix 设计思想》

**unix哲学思想:


**

  1. 小即是美;
  2. 让每一个程序只做好一件事;
  3. 尽快建立原型;
  4. 舍高效而取可移植;
  5. 使用纯文本文件来存储数据;
  6. 充分利用软件的杠杆效应;
  7. 使用shell脚本来提高杠杆效应和可移植性;
  8. 避免强制性的用户界面;
  9. 让每个程序都成为过滤器

**十大准则:


**

  1. 允许用户定制环境;
  2. 量使操作系统内核小而轻巧;
  3. 用小写字母,并尽量保持简短;
  4. 护树木;
  5. 默是金;
  6. 行思考;
  7. 部分之和大于整数;
  8. 找90%的解决方案;
  9. 坏就是更好
  10. 层次化思考;

1.3、linux哲学思想以及个人理解

  linux哲学思想大多数沿袭unix哲学思想,这里列举几个我们平常可能潜意思使用最多的概念。linux哲学思想:

  1. 一切皆文件
    linux的独到之处,就是把众多资源都抽象成文件系统文件的形式。然后开发各种API,提供各种功能模块,开发库,系统调用等来实现对这些抽象的文件进行实际操作。屏蔽了低沉硬件资源的访问难度。后面的章节部分会提到文件按照基本类型分类。
  2. 让每个程序做好一件事
    越是简单精巧的程序,越容易与其他功能相耦合。每个程序做好一件事,更加利于维护好每个程序,其实现难度,代码轻量化,维护等等都显得特别的轻便快捷。代码量的轻量化会更好的节省系统资源的消耗。纵观今天成熟的linux系统,其小巧的工具无不令各大与linux系统接触的工程师惊叹。比如ps,ls,cat等小巧的工具,其每个设计都遵循这一思想,而我们使用起来也比那些所谓的集成组件来的方便多。
  3. 连接每个小程序完成复杂任务
    上面我们讲过,我们尽可能的要让每一个程序做好一件事。当你在遇到复杂的任务的时候,该怎么办?
    其实呢,我们的小程序每一个都能很高效的做好一件事,我们遇到复杂的任务的时候,可以把复杂任务降级,
    一层一层剥离来实现。组合各个小程序来完成这些复杂的任务。
  4. 使用纯文本来存储数据
    纯文本文件存储数据给用户带来的好处即使直白,易于查看与编辑。不需要特别复杂的第三方工具,单纯的一个
    文本查看器就可以实现查阅这些文件的内容,从一个系统转储与另外一个系统,其可移植性也比较好。

二、linux的FHS

2.1、何为FHS

FHSFilesystem Hierarchy Standard的缩写,叫文件系统分层标准。我们都知道linux文件系统不同于windows操作系统,linux都是从一个叫做根"/"的东西发散开来的。我这边不会去深入说文件系统的内容。之前我们说过的内核的基本功能就有一个所谓的文件系统,这里我们文件系统的分层规范是遵守这个FHS标准的。官方的话来解释FHS是这样说的:
The filesystem standard has been designed to be used by Unix distribution developers, package developers, and system implementors.
However, it is primarily intended to be a reference and is not a tutorial on how to manage a Unix filesystem or directory hierarchy.

文件系统标准是被unix的发行商(分发者),包开发者以及操作系统的实现者来使用的。简单来讲,整个操作系统功能的完善以及发行商发型的类unix系统(linux),都离不开这个文件系统标准。
它主要是作为一个参考提供给使用者,并不是一个学习和管理unix文件系统的目录层级标准手册。如果要深入学习文件系统,还要去深入了解其他文档。
FHS的官方链接

2.2、FHS具体内容
  • / 的第一层有以下主要部分:
/bin        "所有用户可用的基本命令程序文件存放路径;"
/sbin      "系统管理使用的工具程序存放路径;"
/boot     "引导加载器必须用到的各静态文件存放路径;"
/dev      "存储特殊文件或设备文件存放路径;"
/etc       "系统程序静态配置文件存放路径;"
/home   "普通用户的家目录存放路径;"
/root     " 管理员的家目录;"
/lib        "系统启动或根文件系统上的应用程序提供共享库以及内核提供内核模块存放路径;"
/lib64    "64位系统特有的存放64位共享库的路径,与/lib功能差不多;"
/opt      "附加应用程序安装的可选路径;"
/proc    "基于内核的虚拟文件系统,用于为内核及进程存储其相关信息,多为内核参数;"
/sys     "sysfs虚拟文件系统提供了一种比proc更为理想的访问内核数据的途径;主要是为管理linux设备提供一种统一模型的接口;"
/srv      "当前主机为服务提供的数据的存放路径;"
/media  "便携式设备挂载点;"
/mnt     "其他文件系统的临时挂载点;"
/tmp     "临时文件存放目录,该目录有特别的权限;"
  • 依托于/ 下的第一层内容,也有比较重要的二层划分:
    /usr的层级划分: (有些层级与/ 下的很类似,至于为什么要这么做,不用太过于纠结)
/usr/bin           # 大部分基本命令程序文件存放路径,和/bin类似;
/usr/sbin         #  系统管理使用的工具程序存放路径,和/sbin类似;
/usr/include    # C程序头文件存放路径;(linux操作系统内核大部分是C代码来实现)
/usr/lib            # 应用程序提供共享库以及内核提供内核模块存放路径,与/lib64类似;
/usr/lib64        # 64位系统特有的存放64位共享库的路径,与/lib64类似;
/usr/share       # 命令手册页和自带文档等架构特有的文件存储位置;
/usr/src           # 程序源码文件的存储位置;
/usr/local        # 系统管理员安装本地应用程序或第三方应用程序安装路径;(这个目录也有分层,我们这里不列出)
  • /var的层级划分:(有些层级与/ 下的很类似,至于为什么要这么做,不用太过于纠结)
/var/account    # 进程计数日志,可选的。可以忽略;
/var/cache       #  应用程序缓存数据存放路径;
/var/crash       # 系统奔溃时转存储文件路径,见的比较少,可以忽略;
/var/games     # 动态游戏数据存储路径,忽略;
/var/lib            # 动态状态信息数据存放路径;
/var/lock         # 进程锁文件存放路径;
/var/log          # 系统级别日志文件存储路径;
/var/mail        # 用户邮件文件存放路径;
/var/opt         # 和/opt类似,存放附加应用程序的动态数据路径;
/var/run         # 进程运行时数据存放路径;
/var/spool     # Application spool data,应用计时相关数据存放路径,比如定时计划,邮件等,将来的任务或未收取的内容等;
/var/tmp       # 临时文件存放路径,和/tmp功能类似;  
/var/yp          # 网络服务数据库文件存储路径,可选的,很少见,忽略;

以上内容,大部分都遵循设计标准(官方的解释与我们的解释可能不太一样,深入其含义差不多,标准只是一个涉及,实际应用存放可能并未100%遵循这个标准)。如果要深入了解,请参考官方手册。
最新的FHS官方html格式手册地址

三、linux的bash特性

3.1、基本文件分类以及bash的基本特性之补全

我们这里说的补全,是bash的一种基本特性。它可以用来做路径补全以及文件名补全。遵循unix涉及哲学思想,万物皆文件,linux大部分的(99.9%)的工具或者应用都抽象或者组织成文件的存储形式。这里的文件是广义的文件,与狭义的文件(文本文件)是不同的概念。比如我们认为的按照类型可以大致分为以下几类文件:

  • 常规文件:通常用符号"-"或字母"f"表示,英文 regular file;
  • 目录文件:通常用字母"d"表示,英文 directory;
  • 块设备文件:通常用符号"b"表示,英文 block device;
  • 字符设备文件:通常用字母"c"表示,英文 character device;
  • 符号链接文件:通常用字母"l"表示,英文 symbolic link;
  • 命名管道文件:通常用字母"p"表示,英文 pipe;
  • 套接字文件:通常用字母"s"表示,英文 socket;

经过基本的介绍文件类型分类,我们知道,我们想要查看一下文件,就要知道文件名,在不知道文件名的情况下,我们的bash的补全特性就显得比较实用。命令补全是用到了符号"tab"。具体实践,自己去实现,可以在写命令不知道文件全名的时候tab一次,不知道完整的文件名的时候tab两次,目录也是如此。

3.2、bash的基本特性之别名

何为别名?想象现实生活中的场景,你作为一名中国人,来自于中国的一个家庭,你通常拥有一个家庭内部的名字,比如你叫王二蛋,你在出生地派出所上了户口,办理了×××,省份证的id号也是你独有的。这时候后,你去了学校,人家都叫你的名字,有同学会给你起绰号,比如叫二蛋,蛋蛋之类的。还有,你在班级申请了一个数学课代表,每次老师或者同学在班级内叫数学课代表,这也就是你的身份,你会应答他(她)。假如你考上大学,加入了一个社团,你是某某学生会主席,这个学生会主席也是你的身份。你参加了工作,加入某个部门,比如你是一名数据库管理员,这一类的职位称谓也是你的身份。其实,生活中的种种这些,其实都是广义的别名。
我们linux的bash的别名亦是如此。bash有会话级别以及全局级别(后面讲变量作用域会简单提及),我们会针对我们自己的会话个性化的设置一些别名来更好的帮助我们完善我们系统的管理和维护工作。以维护系统为例,举个通俗的例子,我们要连接数据库,数据库连接有一连串的参数要输入,如果每次操作都要输这么一长串,你可能会选择做一个别名,或者写一个工具来代替这一部分人为输入的工作。比如你叫王二蛋,你可以这样做,定义一个别名,叫erd_mysql_connect1_3306来表示一连串的东西"mysql -h127.0.0.1 -uwangerdan -P3306 --default-character-set=utf8 -p123erdwang"。接下来,我们来看看系统预设的别名(alias)有哪些(以CentOS 7.x系列为例):

普通用户的:
[fedora@zabbix-server ~]$ alias
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias vi='vim'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'

管理员用户的:
[root@zabbix-server ~]# alias
alias cp='cp -i'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mv='mv -i'
alias rm='rm -i'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'

通过上面,我们可以看到,管理员用的cp,egrep,fgrep,grep,ls,ll,mv,rm等,普通用户用户egrep,fgrep,grep,ls,ll,vi等都是别名。至于这些命令干什么用的,我这里暂时不介绍。

  • 查看别名
查看别名,直接使用alias命令,在shell会话窗口执行alias命令即可。

[root@zabbix-server ~]# alias
  • alias命令帮助
[root@zabbix-server ~]# whatis alias
alias (1)            - bash built-in commands, see bash(1)
[root@zabbix-server ~]# which alias
/usr/bin/alias
[root@zabbix-server ~]# ls -l /usr/bin/alias
-rwxr-xr-x. 1 root root 29 Apr 11 08:53 /usr/bin/alias
[root@zabbix-server ~]# rpm -qf /usr/bin/alias
bash-4.2.46-30.el7.x86_64
[root@zabbix-server ~]# whereis alias
alias: /usr/bin/alias /usr/share/man/man1/alias.1.gz
[root@zabbix-server ~]# type alias
alias is a shell builtin

从上面的命令可以看出,alias是一个内建命令。是bash程序包内生自带的,我上一篇博文已经讲过了
如何查看内建命令帮助,我们可以使用help builtin_Command的形式来查看帮助文档。

alias: alias [-p] [name[=value] ... ]
    Define or display aliases.

    Without arguments, `alias' prints the list of aliases in the reusable
    form `alias NAME=VALUE' on standard output.

    Otherwise, an alias is defined for each NAME whose VALUE is given.
    A trailing space in VALUE causes the next word to be checked for
    alias substitution when the alias is expanded.

    Options:
      -p    Print all defined aliases in a reusable format

    Exit Status:
    alias returns true unless a NAME is supplied for which no alias has been
    defined.
  • 设置别名语法
alias 别名(NAME)=值(VALUE)
例如:
    alias lvl=`ls /var/log/`

说明:设置别名,尽可能见其名知其意,因为凌乱的设置可能会导致管理起来更加困难,
当然,如果你每次使用前,先查看一遍,也没有关系(一切取决于你)。    
3.3、bash的基本特性之历史记录
  • 概述:
    history这个内置命令会显示和维护历史记录列表;shell进程保存此前用户提交执行过的命令;
    可以这么理解,默认在会话级别操作的历史记录,默认的历史记录控制参数,会先把命令提交
    写入内存缓冲中,待下一次手动或自动同步到历史记录存储文件中。
    history历史记录会受到环境变量的影响而变化,以下几个历史记录环境变量:

    HISTSIZE:shell进程可保留的命令历史的条数;
    HISTFILE:持久保存命令的历史的文件;
    HISTFILESIZE:命令历史文件的大小;
    HISTCONTROL:ignoredups表示忽略重复的命令;ignorespace表示忽略以空白字符开头的命令;
    ignoreboth表示生效ignoredups和ignorespace。
    
    以下是我一个会话的查看这三个变量的值:
    [root@ACA86E6E ~]# echo $HISTSIZE
    1000
    [root@ACA86E6E ~]# echo $HISTFILE
    /root/.bash_history
    [root@ACA86E6E ~]# echo $HISTFILESIZE
    1000
    [root@ACA86E6E ~]# echo $HISTCONTROL
    ignoredups
  • 选项

    -c:表示清空命令历史;
    -d offset:删除指定命令历史;
    -r:从文件读取命令历史至历史列表中;
    -w:把历史列表中的命令追加至历史文件中;
    history NUMBER:指定显示最近的具体数量的历史记录命令;
  • 与历史记录相关的几个快捷操作
    !NUMBER :指定再一次执行历史命令列表中的指定NUMBER编号的历史记录命令;
    !! :再一次执行上一条命令;
    !STRING :再一次执行命令历史列表中最近一个以STRING开头的命令;
    Ctrl +R(r):输入关键字可以搜索历史记录中执行过的命令;
3.4、bash的基本特性之快捷键

bash快捷键参考链接
整理后bash快捷键列表:

索引编号快捷键组合快捷键含义简述备注
1Ctrl + L(l)清屏
2Ctrl + A(a)把当前命令行光标跳转至行首
3Ctrl + E(e)把当前命令行光标跳转至行尾
4Ctrl + U(u)删掉当前光标位置到行首之间的字符串内容
5Ctrl + K(k)删掉当前贯标位置到行尾之间的字符串内容
6Ctrl + C(c)终止当前作业
7Esc + . 调用上一条命令的最后一个命令行位置参数内容
8Ctrl + P(p)或 ↑调用历史记录缓存中的上一条命令,多次执行会一直往上翻
9Ctrl + N(n)或 ↓调用历史记录缓存中的下一跳命令,多次执行会一直往下翻
10Ctrl + F(f)从光标所在位置向前移动一个字符
11Ctrl + B(b)从光标所在位置向后移动一个字符
12Alt + F(f)从光标所在位置向前移动一个单词,如果光标在单词之间,所在单词算一个单词建议在本地非远程终端操作,部分远程模拟终端Alt字符有特殊含义
13Alt + B(b)从光标所在位置向后移动一个单词,如果光标在单词之间,所在单词算一个单词建议在本地非远程终端操作,部分远程模拟终端Alt字符有特殊含义
14Esc + F(f)从光标所在位置移动到当前单词的结尾
15Esc + B(b )从光标所在位置移动到当前单词的开头
16Esc + W(w)删除光标所在位置到当前单词之间的字符串内容,以空格,标点等为分隔符
17Esc +T(t)把当前光标所在字符与之前的字符交换位置,并把光标移动到下一个字符
18Ctrl + Y(y)再一次粘贴之前用Ctrl + u或Ctrl +k 删除的内容,并把光标移动到粘贴部分的字符串的最尾端
19Ctrl + (X U)撤销刚才的操作,按住Ctrl的同时在先后按x和u
20Ctrl + S(s)挂起当前的shell
21Ctrl + Q(q)重新启用之前挂起的shell,如果挂起之后,键盘有键入内容,重新启用后,会显示这些之前键入的内容
22Alt + U(u)以当前光标位置开始,往后直到分隔单词字符,算作一个单词,把这个单词的所有小写字母转换为大写字母建议在本地非远程终端操作,部分远程模拟终端Alt字符有特殊含义
23Alt + L(l)以当前光标位置开始,往后直到分隔单词字符,算作一个单词,把这个单词的所有大写字母转换为小写字母建议在本地非远程终端操作,部分远程模拟终端Alt字符有特殊含义
24Alt + C(c)以当前光标位置开始,往后直到分隔单词字符,算作一个单词,把这个单词的首字母从小写字母变成大写字母建议在本地非远程终端操作,部分远程模拟终端Alt字符有特殊含义
3.5、bash的基本特性之命令行展开

bash的展开(expansion)特性算是一个非常使用的东西。展开(expansion)有以下几类:

  • brace expansion({}展开);
  • tilde expansion (~ 展开)
  • parameter and variable expansion (参数和变量展开)
  • command substitution (命令替换)
  • arithmetic expansion (算术展开)
  • word splitting (单词分割)
  • pathname expansion (路径展开)

这里主涉及"{}的展开"的知识点。
在{} (大括号,花括号)内,可以是以逗号(,)分隔的字符串,也可以是一个序列的表达式。
大括号前后可以跟前缀和后缀。
1.逗号分隔

[root@zabbix-server ~]# echo a{b,c,d}e
abe ace ade

2.序列表达式
'{X..Y[..INCR]}'
X,Y是数字或单个字符,INCR是步长。
当X和Y是数字时,展开为X和Y的所有数字。数字可加前缀0,例如:01,001等

当X和Y以0开头时,shell尝试将生成的结果保持相同的广度,必要的时候会用0填充。
常见形式:{0..10},{a..z},{0..100..2},{a..z..2}等等,请看下面的示例:

[root@zabbix-server ~]# echo {0..10}
0 1 2 3 4 5 6 7 8 9 10
[root@zabbix-server ~]# echo {0..10..2}
0 2 4 6 8 10
[root@zabbix-server ~]# echo {0..10..3}
0 3 6 9
[root@zabbix-server ~]# echo {0..20..5}
0 5 10 15 20
[root@zabbix-server ~]# echo {a..z..3}
a d g j m p s v y
3.6、bash的基本特性之通配符以及其他

bash浏览的时候会把以下几个字符当作特殊字符处理,一般处理,关键字会被作为一个pattern来处理。
特别的pattern字符以及含义如下:

  • * 匹配任意长度的任意字符,包括空;
  • ? 匹配任意单个字符
  • [...] 匹配指定范围内的单个字符,以下几种形式:
    [a-z],[A-Z],[0-9],[a-z0-9],[a-zA-Z0-9]等等。
    [[:upper:]] 表示所有大写字母;
    [[:lower:]] 表示所有小写字母;
    [[:alpha:]] 表示所有字母;
    [[:digit:]] 表示所有数字;
    [[:alnum:]] 表示所有字母和数字;
    [[:space:]] 表示所有空白字符;
    [[:punct:]] 表示所有标点符号;
  • [^...] 匹配指定范围内的单个字符;

案例1:查看/etc/下以字符pr开头的所有文件和目录以及以单个任意字符结尾的以profile.开头的文件或目录

[root@zabbix-server ~]# ls -ld /etc/pr*
drwxr-xr-x. 2 root root   78 Aug  7 21:37 /etc/prelink.conf.d
-rw-r--r--. 1 root root  233 Jun  7  2013 /etc/printcap
-rw-r--r--. 1 root root 1819 Apr 11 12:18 /etc/profile
drwxr-xr-x. 2 root root  280 Aug 30 09:38 /etc/profile.d
-rw-r--r--. 1 root root 6545 Jun  7  2013 /etc/protocols
[root@zabbix-server ~]# ls -ld /etc/profile.?
drwxr-xr-x. 2 root root 280 Aug 30 09:38 /etc/profile.d

案例2:显示/var目录下所有以l开头,以一个小写字母结尾,且中间出现一位任意字符的文件或目录

[root@zabbix-server ~]# ls -ld /var/l?[[:lower:]]
drwxr-xr-x. 33 root root 4096 Sep  7 10:28 /var/lib
drwxr-xr-x. 10 root root 4096 Sep  6 03:18 /var/log

案例3:显示/etc目录下,以任意一位数字开头,且以非数字结尾的文件或目录

[root@zabbix-server ~]# ls -ld /etc/[0-9]*[^0-9]
ls: cannot access /etc/[0-9]*[^0-9]: No such file or directory
[root@zabbix-server ~]# ls -ld /etc/[0-9]*[^0-9]
ls: cannot access /etc/[0-9]*[^0-9]: No such file or directory
[root@zabbix-server ~]# touch /etc/{0..9}abce
[root@zabbix-server ~]# ls -ld /etc/[0-9]*[^0-9]
-rw-r--r-- 1 root root 0 Sep  7 21:29 /etc/0abce
-rw-r--r-- 1 root root 0 Sep  7 21:29 /etc/1abce
-rw-r--r-- 1 root root 0 Sep  7 21:29 /etc/2abce
-rw-r--r-- 1 root root 0 Sep  7 21:29 /etc/3abce
-rw-r--r-- 1 root root 0 Sep  7 21:29 /etc/4abce
-rw-r--r-- 1 root root 0 Sep  7 21:29 /etc/5abce
-rw-r--r-- 1 root root 0 Sep  7 21:29 /etc/6abce
-rw-r--r-- 1 root root 0 Sep  7 21:29 /etc/7abce
-rw-r--r-- 1 root root 0 Sep  7 21:29 /etc/8abce
-rw-r--r-- 1 root root 0 Sep  7 21:29 /etc/9abce
或
[root@zabbix-server ~]# ls -ld /etc/[[:digit:]]*[^0-9]
-rw-r--r-- 1 root root 0 Sep  7 21:29 /etc/0abce
-rw-r--r-- 1 root root 0 Sep  7 21:29 /etc/1abce
-rw-r--r-- 1 root root 0 Sep  7 21:29 /etc/2abce
-rw-r--r-- 1 root root 0 Sep  7 21:29 /etc/3abce
-rw-r--r-- 1 root root 0 Sep  7 21:29 /etc/4abce
-rw-r--r-- 1 root root 0 Sep  7 21:29 /etc/5abce
-rw-r--r-- 1 root root 0 Sep  7 21:29 /etc/6abce
-rw-r--r-- 1 root root 0 Sep  7 21:29 /etc/7abce
-rw-r--r-- 1 root root 0 Sep  7 21:29 /etc/8abce
-rw-r--r-- 1 root root 0 Sep  7 21:29 /etc/9abce
3.7、bash的登录shell(交互式的)的加载启动文件

bash的shell登录类型可以分为"交互式登录shell"和"非交互式登录shell";

  • 交互式登录shell
    直接通过某终端输入账号和密码后登陆打开的shell进程;
    使用su命令,su - USERNAME ,su -l USERNAME执行的登录切换等;

  • 非交互式登录shell
    su USERNAME(没有带符号"-"切换)执行的登录切换;
    图形界面下打开的终端;
    运行脚本等

配置文件可以简单分为profile类和bashrc类:

  • profile类
    全局:对所有用户都生效的配置(/etc/profile,/etc/profile.d/*.sh)
    单独用户个人:仅对当前用户有效(~/.bash_profile)

  • bsahrc类
    全局:/etc/bashrc
    单独用户个人:~/.bashrc

小贴士:仅仅管理员可以修改全局配置;

  • 交互式登录shell加载配置文件顺序:
    /etc/profile(包括/etc/profile.d*) ==> ~/.bash_profile ==> ~/.bash_login ==> ~/.profile ==> ~/.bashrc ==> /etc/bashrc (如有错误,希望各位提出纠正,可以通过写每个配置文件写一句话,然后登陆验证一下);
    特别说明:此加载顺序,是自己根据man手册说明自己理解翻译的,可能顺序不对,下面有验证过程,此为一个争议问题,自己先留下做个记录?

  • 交互式登录shell加载配置文件:
    ~/.bash_logout ==> /etc/bash.bash_logout

  • 非交互式登录shell加载配置文件顺序:
    ~/.bashrc ==> /etc/bashrc ==> /etc/profile.d/*

验证第一种情况:

[root@ACA86E6E ~]# tail -1 /etc/profile
/usr/bin/touch /tmp/aaa.iso
[root@ACA86E6E ~]# tail -1 /etc/profile.d/test.sh 
/usr/bin/touch /tmp/bbb.iso
[root@ACA86E6E ~]# tail -1 ~/.bash_profile 
/usr/bin/touch /tmp/ccc.iso
[root@ACA86E6E ~]# tail -1 ~/.bash_login
/usr/bin/touch /tmp/ddd.iso 
[root@ACA86E6E ~]# tail -1 ~/.profile
/usr/bin/touch /tmp/eee.iso
[root@ACA86E6E ~]# tail -1 ~/.bashrc
/usr/bin/touch /tmp/fff.iso
[root@ACA86E6E ~]# tail -1 /etc/bashrc 
/usr/bin/touch /tmp/ggg.iso

linux 基础知识点杂项-续
根据实践,交互式登录shell加载顺序为:
/etc/profile.d/* --> /etc/profile --> /etc/bashrc --> ~/.bashrc --> ~/.bash_profile
以上是我的疑问点,目前我把这个问题归为不解问题,暂时先放着儿,希望大伙看到后可以指点一二。

四、linux下的基础管理命令

4.1、linux下杂项基础命令
  • 相对路径:不以符号"/"开头的目录都叫相对路径;
    示例: ./,../,etc/nginx/,./var/../data/等等

  • 绝对路径:以符号"/"开头的目录都叫绝对路径;
    示例:/root,/tmp,/data等等
pwd:打印当前工作绝对路径;
cd:切换当前工作路径
         cd的几个常见组合:
                cd 不带任何参数,表示切换到当前登录用户的的家目录;
                    cd ~ 表示切换到当前登录用户的夹目录;
                    cd - 表示在上一次所在目录与当前所在目录之间来回做对切;
echo    显示文本的一行或者指定一行文本
        -n 输出文本结尾不带换行符,默认有换行符;
        -e 允许解析以符号反斜线(\)指定的特殊字符。常见特殊字符:
                \\ 表示反斜线\本身;
                \n 表示unix换行符;
                \t 表示横向制表符;
file  判断文件类型,上一篇博文有提到过;
type 显示关于命令的类型信息信息,上一篇博文有提到过;
tty 显示终端信息;
4.2、linux网络接口维护的老×××命令
1> ifconfig [interface]
查看指定网络接口或所有可被识别的网络接口的信息;当省略interface网络接口名的时候,会列出所有
可识别的激活的网络接口的信息,如果加上选项-a且省略接口名,会列出所有可识别的网络接口的
信息(就算没有激活的网络接口也会列出)

========================================================================
例如:ifconfig eth0
eth0      Link encap:Ethernet  HWaddr 00:0C:29:7E:99:93  
          inet addr:172.168.110.11  Bcast:0.0.0.0  Mask:255.255.255.0
          inet6 addr: fe80::20c:29ff:fe7e:9993/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:58945 errors:0 dropped:0 overruns:0 frame:0
          TX packets:28406 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:59397730 (56.6 MiB)  TX bytes:7314874 (6.9 MiB)

输出信息简单说明:
    eth0:网络接口名;

    Link encap:网络类型;
    Hwaddr:MAC地址;

    inet addr:IPv4地址
    Bcast:广播地址;
    Mask:子网掩码;

    inet6 addr:IPv6地址;
    Scope:作用域,范围。link表示仅对该接口有效;

    UP BROADCAST RUNNING MULTICAST:(显示网络设备状态信息)
        UP表示网卡已启用;
        BROADCAST表示支持广播;
        RUNNING表示网卡的网线接口被接上;
        MULTICAST表示支持组播(多播);

    MTU:最大的传输单元;
    Metric:路由度量值;

    RX packets:代表网络自启动开始至目前统计时刻指定接口接受的包(报文)数量;
        errors: 表示接收出错的报文的数量;
        dropped: 表示丢弃的报文的数量;
        overruns: 表示溢出的报文的数量
        frame: 表示冲突的帧数;

    TX packets:代表网络自启动开始至目前统计时刻的通过指定接口发送传输的报文数量;
        errors:表示发送出错的报文数量;
        dropped:表示发送丢弃的报文数量;
        overruns:载荷数
        carrier:冲突数

    collisions:代表风暴碰撞的情况,如果发生太多次,表明网络状态可能不好;
    txqueuelen:传输数据的缓冲区的储存长度;
    RX bytes:总接收字节数量;
    TX bytes:总发送字节数量;

例如:ifconfig lo
lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)

例如:ifconfig 
eth0      Link encap:Ethernet  HWaddr 00:0C:29:7E:99:93  
          inet addr:172.168.110.11  Bcast:0.0.0.0  Mask:255.255.255.0
          inet6 addr: fe80::20c:29ff:fe7e:9993/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:58916 errors:0 dropped:0 overruns:0 frame:0
          TX packets:28378 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:59394980 (56.6 MiB)  TX bytes:7311222 (6.9 MiB)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)
========================================================================

2> 启停网络接口

ifconfig eth0 down #停止eth0网卡接口(生产勿轻易尝试,测试环境测试,远程连接可能会断开)
ifconfig eth0 up #启动eth0网卡接口

3> 设置ipv4地址
ifconfig eth0 172.168.110.11 netmask 255.255.255.0 up
ifconfig eth0 172.168.110.11/24 up

配置虚拟接口网络地址:
    一个物理网卡可以配置多个ip地址。假设网卡设备为eth0,可以配置成以下形式:
        eth0:0
        eth0:1
        eth0:2
        eth0:3
        eth0:4
        eth0:5
        ...
        后边的数字只要是0到255之间都可以。也就是说,一块物理网卡至多可以配置256个虚拟网卡,
        假设不考虑网段ip地址是否占用或有效。

        配置语法和上边的一样,假设配置eth0:0
        ifconfig eth0:0 172.168.110.22/24 up

4> 查看统计信息
ifconfig -s
[root@vir-rs1 ~]# ifconfig -s
Iface   MTU Met    RX-OK RX-ERR RX-DRP RX-OVR    TX-OK TX-ERR TX-DRP TX-OVR Flg
eth0       1500   0    62669      0      0      0    31642      0      0      0 BMRU
eth0:0     1500   0      - no statistics available -                            BMRU
lo        65536   0        0      0      0      0        0      0      0      0 LRU

Iface列表示网卡接口名;
MTU表示最大的传输单元(显示数据帧的最大长度);
Met:路由度量值;
RX-OK:接收时,正确的数据包数;
RX-ERR:接受时,产生错误的数据包数;
RX-DRP:丢弃的数据包数;
RX-OVR:接收时,由于过速(在数据传输中,由于接收设备不能接收按照发送速率传送来的数据而使数据丢失)而丢失的数据包数。
TX-OK:发送,正确的数据包数;
TX-ERR:发送时,产生错误的数据包数;
TX-DRP:发送时丢弃的数据包数;
TX-OVR:发送时,由于过速而丢失的数据包数。
Flag:标志位;
4.3、与开关机相关的命令(请在测试环境演练)
shutdown 
    Usage: shutdown [OPTION]... TIME [MESSAGE]

    -r  重启
    -h  关机
    -H  大致和 -h一样,
    -P  重启
    -c  取消一个重启的计划,立即重启的取消不了(要在另外一个登陆终端来取消,因为执行shutdown的终端是阻塞的,除非后台执行或者利用其他像screen东西来实现)
    -k  只是发送警告信息,并不是真正操作重启

    TIME:这个是必须要指明的属性。常用的有:
        now:表示立即操作;
        +m:表示等多少分钟后操作;
        hh:mm 表示设定到这个时刻点的时候操作;

    MESSAGE是附加的广播信息内容,如果你为了做维护工作,可以通过广播的形式告知别的终端,未来什么时刻点,将会有维护操作,重启,关机之类的。

比如:
shutdown -r +2      
shutdown -r +2 &
提示信息:(每隔一分钟提示一次)
    The system is going down for reboot in 2 minutes!
    The system is going down for reboot in 1 minute! 

以下三个命令选项一样,我们放一起说
poweroff
halt
reboot 
    -n, --no-sync 重启前写内存数据到磁盘,直接重启。(不安全)
    -f,--force  强制重启
    -p,--poweroff 关掉电源,重启系统
    -w,--wtmp-only 不会调用shutdown和reboot系统调用,只会写重启记录到/var/log/wtmp文件。
    --verbose 调试信息更多。
    --halt 关机,不管是调用halt,poweroff还是reboot (会向已经登录的终端发送广播通知,系统1分钟后关机)

还有一个命令可以实现重启与关机,通过linux的命令级别来实现:
linux的命令级别有7中,分别为
0表示关机
6表示重启
1表示单用户模式
2表示没有网络文件系统的多用户模式
3表示命令行模式
4预留
5表示图形化界面模式

CentOS 6.x系列之前,可以查看/etc/inittab这个配置文件,里面有对这7中模式进行简单解释。
CentOS 7.x系列后,很多功能都集成由systemctl来管理,这里暂时不深入说明。

重启,可以使用:init 6
关机,可以使用:init 0
4.4、linux下的目录管理命令
mkdir 表示创建目录的命令;
        用法:mkdir [OPTION]... DIRECTORY...
                    命令 [选项] 目录
        常用选项:
                    -p:表示递归创建目录;
                    -v:表示纤细详细过程;
                    -m MODE:表示指定创建目录的权限
        例子:
        [root@zabbix-server ~]# mkdir -pv -m 400 /root/help
        mkdir: created directory ‘/root/help’
        [root@zabbix-server ~]# ls -ld /root/help/
        dr-------- 2 root root 6 Sep  7 21:55 /root/help/

rmdir 表示删除空目录的命令;
示例:
        [root@zabbix-server ~]# rmdir /root/help/
        [root@zabbix-server ~]# ls -ld /root/help
        ls: cannot access /root/help: No such file or directory

tree 表示以树状结构列出文件目录列表;
-L level:指定要显式目录层级的层数;
示例:
    [root@zabbix-server ~]# tree -L 1 /
        /
        ├── bin -> usr/bin
        ├── boot
        ├── data
        ├── dev
        ├── etc
        ├── home
        ├── lib -> usr/lib
        ├── lib64 -> usr/lib64
        ├── media
        ├── mnt
        ├── opt
        ├── proc
        ├── root
        ├── run
        ├── sbin -> usr/sbin
        ├── srv
        ├── sys
        ├── tmp
        ├── usr
        └── var
4.5、linux下的文件管理命令
cat - concatenate files and print on the standard output
表示拼接文件内容并把它们输出到标准输出。
示例:
    [root@zabbix-server ~]# echo 123 >test1
    [root@zabbix-server ~]# echo 234 >test2
    [root@zabbix-server ~]# cat test1
    123
    [root@zabbix-server ~]# cat test2
    234
    [root@zabbix-server ~]# cat test1 test2
    123
    234
常用选项:
        -n,--number 表示给所有输出行标记上行号;
        -T,--show-tabs 表示显示文本中的横向制表符,用^I来表示;
        -E,--show-ends 表示显示行尾的换行符,用$来表示;
        -A,--show-all 表示显示所有特殊符号
示例:
        [root@vir-rs1 ~]# head -n 10 /etc/init.d/functions | cat -A
        # -*-Shell-script-*-$
        #$
        # functions^IThis file contains functions to be used by most or all$
        #^I^Ishell scripts in the /etc/init.d directory.$
        #$
        $
        TEXTDOMAIN=initscripts$
        $
        # Make sure umask is sane$
        umask 022$

tac - concatenate and print files in reverse
拼接形式打印出来,选项和cat一样,这里不解释了。

more 文本过滤器,按分页机制读取
less 文本过滤器,按照分页机制读取
这两个常用来查看大文件,因为这两个工具不是把所有的内容一次性读入,具体选项,请参考手册。

head 表示查看文件的前n行,默认表示查看文件前10行
        -n LINE_NUMBER,LINE_NUMBER表示指明查看的行数量
        -LINE_NUMBER,这个等价于上面的选项

tail 表示查看文件的后n行,默认表示查看文件的后10行
        -n LINE_NUMBER,LINE_NUMBER表示指明查看的行数量
        -LINE_NUMBER,这个等价于上面的选项
        -f 表示实时查看文件选项,用于调试日志的时候常用,类似于命令tailf

小说明:有时候为了查看文件的中间多少行,可以利用head加tail结合,利用管道特性,达到需求目的。
=====休息一下吧======

cp 命令,因为重要所以,单独分一栏:

cp - copy files and directories,复制文件或目录
语法有三种形式,如下:
       cp [OPTION]... [-T] SOURCE DEST
       cp [OPTION]... SOURCE... DIRECTORY
       cp [OPTION]... -t DIRECTORY SOURCE...
第一种形式,表示单源复制,就是说复制单个文件或目录
复制的时候分情况,如果DEST存在,如果DEST不存在;
如果DEST是目录,如果DEST是文件。
1. DEST不能存在
先创建复制的文件,并复制源文件的数据流至目标文件中;
2. DEST存在且为文件
会用源文件覆盖目标文件;
3. DEST存在且为目录
先在DEST目录中创建一个与源文件名字一样的文件,并把源文件的数据流复制于创建的文件中;

第二,第三种形式,表示多源复制,复制多个文件或目录
1.DEST不存在
会报错,提示目标DEST不是一个目录(实际是源文件有多个,无法复制多个文件替换一个不存在的文件);
2.DEST存在且不为目录
会报错,和第一种一样,不能复制
3.DEST存在且为目录
分别复制每一个文件至目标目录中,并维持其原名,复制的原理,与单源复制一样,先创建文件,
然后复制数据流。

选项:
-i:表示交互式复制,复制覆盖前会提示用户是否替换,比较安全(防止意外替换),有时候又比较烦人(脚本中);
-f:表示强制复制覆盖文件;
-r,-R:表示递归复制目录,如果是多源复制或目录,要用到;
-d:复制符号链接本身,而非指向的源文件;
-a:表示复制的时候保留所有属性,常用于归档文件,复制保留文件属性等应用
--preserv=ATTRIBUTE_NAME
相关属性名有以下几种:
        >mode:权限模型;
        >ownership:权限从属关系,属主和属组;
        >timestamps:文件时间戳属性;
        >content:安全标签;
        >xattr:扩展属性;
        >links:符号链接
        >all:上述所有属性。

mv命令:移动(重命名)文件

语法也单源和多源移动,语法结构参考cp的讲解。
       mv [OPTION]... [-T] SOURCE DEST
       mv [OPTION]... SOURCE... DIRECTORY
       mv [OPTION]... -t DIRECTORY SOURCE...

选项:
        >-i 表示交互式模式;
        >-f 表示强制移动;

rm 命令:remove files or directories,删除文件或目录

这个命令是linux系统危级别很高的一个命令,切记不知道的时候慎用。
语法结构:rm [OPTION]... FILE...
可以省略选项,可以通知接多个文件名,包括目录;
-i:交互式模式,会提示用户是否删除文件或目录;
-f:忽略不存在的文件,删除文件不会提示;
-r, -R, --recursive,递归删除文件和目录,最危险的选项
--preserve-root 安全的选项,默认的,当用户执行rm -rf /,会提示保护,慎用rm -rf,这里列出来
是为了让用户更加了解后;
--no-preserve-root ,执行rm -rf /,也不会保护,这个选项就是不顾一切都要删掉。慎用rm -rf以及该选项。

待后续,我们深入学习文件系统原理后,在针对这几个命令来做分析讲解。cp,touch,mv,rm,ln等。

4.6、导出变量属性
本来我们这个命令不应该在这里给出,个人觉得应该配合shell脚本编程的时候给出。不过我们这里提一下。
export
用法:export [-fn] [name[=value] ...] or export -p
导出shell变量的属性。是我们通常说的设置环境变量用到的命令。

-p:显示所有导出的变量和函数的列表
-n:移除指定导出变量的属性,让其作用域又缩小;

假设你有了shell脚本编程基础,我们来配合几个案例简单说明一下:
1. 不加export定义变量
[root@localhost ~]# a=123
[root@localhost ~]# echo $a
123
[root@localhost ~]# bash
[root@localhost ~]# echo $a

[root@localhost ~]# whoami
root
[root@localhost ~]# who am i
root     pts/0        2018-09-20 22:15 (192.168.56.1)
以上是我第一个会话的终端,定义流一个变量a,如果我在当前bash下启用一个子shell,就没有变量a了。
看另外一个会话:
[root@localhost ~]# who am i
root     pts/1        2018-09-20 22:27 (192.168.56.1)
[root@localhost ~]# echo $a

另外一个会话也没有变量a。

2. 加export定义变量或定义变量后利用export导出它
[root@localhost ~]# echo $name

[root@localhost ~]# who am i
root     pts/0        2018-09-20 22:15 (192.168.56.1)
[root@localhost ~]# export name=jerry
[root@localhost ~]# echo $name
jerry
[root@localhost ~]# bash
[root@localhost ~]# echo $name
jerry
[root@localhost ~]# hello=world
[root@localhost ~]# export hello
[root@localhost ~]# echo $hello
world
[root@localhost ~]# bash
[root@localhost ~]# echo $hello
world
第一个会话,我们采用了两种方式,第一种在定义变量的时候直接加上export,第二种是复制变量后再加上export导出。可以看见,利用export导出的变量,其作用域不仅仅是当前shell,还包括当前shell衍生的子shell会话。不过对其他会话没有影响。
[root@localhost ~]# who am i
root     pts/1        2018-09-20 22:27 (192.168.56.1)
[root@localhost ~]# echo $name

[root@localhost ~]# echo $hello

在另外一个终端会话,我们查看这两个变量,发现值都为空。

3. export 导出所有变量
export或export -p都可以。

4. export去掉已经导出的变量
[root@localhost ~]# export my_name=yanhui
[root@localhost ~]# bash
[root@localhost ~]# echo $my_name
yanhui
[root@localhost ~]# exit
exit
[root@localhost ~]# export -n my_name
[root@localhost ~]# echo $my_name
yanhui
[root@localhost ~]# bash
[root@localhost ~]# echo $my_name

[root@localhost ~]# export -p |tail -1
declare -x name="jerry"

第一次定义一个导出的变量my_name,利用-n选项去掉导出属性后,子shell的作用域中,变量无值了。可以
看到我们所有导出变量列表的最后一行并没有我们的这个my_name变量。这里不解释declare -x,等后续再
说明(shell编程博文部分)。

五、linux下的与文件相关的时间戳简单讲解

5.1、ls 命令 - 列出目录内容

说明:ls表示列出目录内容,默认按照字母顺序从小到大排序(字母首字母相同比较第二个,并依次类推)出当前目录下的文件(广义的文件)。-cftuvSUX 或者--sort参数都会影响排序。

选项
-a,--all:显示所有文件,包括隐藏文件(unix的隐藏文件以字符.开头);


-A,--almost-all:显示所有的文件,包括去掉"."和".."两个特殊文件之外的其他隐藏文件;


--color=[WHEN]:对输出文件着色,WHEN可选参数"never","no","none","auto","tty","if-tty","yes","force","always"(不指定表示默认选这个);


-d,--directory:列出目录不包括目录里面的内容;


-l:使用长格式输出;
输出中有9列,分别含义为:
第一列:对象权限属性和selinux标志
第二列:对象硬链接数
第三列:对象所有者(属主)
第四列:对象所有组(属组)
第五列:对象大小属性
第六列:对象mtime属性中的月份英文缩写
第七列:对象mtime属性中的日数字
第八列:对象mtime属性中的时分
第九列:对象本身名字
额外说明:当ls -l查看的是字符设备或者块设备时候,条目属性共有9列,第四列表示的不是
属组了而是硬件类型,第五列表示 的不是对象大小属性而是硬件的主次版本号(主和次
版本号之间用逗号隔开),其他列和普通对象一致。


-n,--numberic-uid-gid:


-h,--human-readable:和-l选项一起,以可读的方式列出显示格式(1K 234M 2G),根据文件大小自动转换;


-i,--inode:显示每个文件的inode编号;


-m:用符号",”来分隔列出的文件条目;


-p,--indicator-style=slash,长选项的可选参数:none,slash,file-type,classify。表示给列出的目录后面加上一个符号"/";


-Q, --quote-name:表示用双引号把文件条目引起来;


--quoting-style=WORD,WORD可选值:literal,locale,shell,shell-always,c,c-maybe,escape,clocale
使用不同风格的引用把列出的文件条目引起来;


-F,--classify:会在列出的文件中按照一定规则给文件条目后面加上特殊字符,特殊字符的含义分别表示:
* 表示可执行的普通文件,
/ 表示目录;
@ 表示符号链接;
| 表示FIFO管道(匿名管道和命名管道文件)
= 表示套接字文件;
常规文件不加特殊标记;
\> 表示doors,这个不知道如何翻译,遇到再说;


-r,--reverse:反转排序结果;


-S:按照文件大小从大到小排序;


--format=WORD:以指定的个数输出,WORD可选参数及含义如下:
verbose,long:这两个表示长格式输出,和ls -l类似;
commas:表示条目之间用逗号分隔开,和ls -m类似;
horizontal,across:输出模式为行模式,和参数-x类似;
vertical:和参数-C类似;
single-column:和参数ls -l类似;
context:列出SElinux的安全属性标识;


-R,--recursive:递归列出文件和目录;


-t:按照文件修改时间(modification time,mtime),最新的在前面;


--time=WORD
ls -l长格式显示时间是mtime(文件的修改时间),如果我们要看文件的atime(文件的访问时间),
ctime(文件属性的改变时间),可以通过该参数指定对应的属性关键字查看。WORD可选值:
atime,access,use,ctime,status。例如:
ls -l --time=atime
ls -l --time=ctime


--time-style=STYLE
这个参数也算是自定义格式中比较强大的一个。--time-style的参数支持:
full-iso完全格式,时间显示完整,显示了年月日时分秒微秒时间戳属性以及时区属性;
long-iso 相比上面的full-iso稍逊风骚,秒以及以后的微秒属性戳属性还有时区没有显示,其他和full-iso一样;
iso也不错,把年份省略了;
locale这个显示风格月份是通用英文错卸,其他和iso一样;
STYLE还支持自定义格式,可以参考date的DATE,可以通过"符合参数",来控制自定义显示时间属性风格;
例如:
ls -l --time-style="+%Y-%m-%d %H:%I:%S"
ls -l --time-style="+%Y/%m/%d %H:%M:%S"


5.2、stat命令 - 显示文件和文件系统信息

先来看几个简单的示例:

[root@ACA86E6E ~]# stat anaconda-ks.cfg 
  File: ‘anaconda-ks.cfg’
  Size: 1422        Blocks: 8          IO Block: 4096   regular file
Device: 803h/2051d  Inode: 67157059    Links: 1
Access: (0600/-rw-------)  Uid: (    0/    root)   Gid: (    0/    root)
Context: system_u:object_r:admin_home_t:s0
Access: 2018-08-07 21:41:15.525992412 +0800
Modify: 2018-08-07 21:41:15.530992412 +0800
Change: 2018-08-07 21:41:15.530992412 +0800
 Birth: -

[root@ACA86E6E ~]# stat -t anaconda-ks.cfg
anaconda-ks.cfg 1422 8 8180 0 0 803 67157059 1 0 0 1533649275 1533649275 1533649275 0 4096 system_u:object_r:admin_home_t:s0

[root@ACA86E6E ~]# stat -f anaconda-ks.cfg 
  File: "anaconda-ks.cfg"
    ID: 80300000000 Namelen: 255     Type: xfs
Block size: 4096       Fundamental block size: 4096
Blocks: Total: 12314752   Free: 12058672   Available: 12058672
Inodes: Total: 24641536   Free: 24615302

选项:
        -f,--file-system  display file system status instead of file status,显示文件系统的状态信息
        -t,--terse print the information in terse form,以精简的格式显示打印的信息
        -L, --dereference follow links,表示查看的是符号链接文件的原始文件
        -c  --format=FORMAT 自定义输出格式,几位有换行

        文件输出格式有以下:(以下自定义输出,在我们写脚本的时候非常有用)
        %a     access rights in octal,八进制访问权限,比如600
        %A     access rights in human readable form,十位格式权限位,4段(文件类型,属主,属组,其他者)
        %b     number of blocks allocated (see %B),已经分配的块的数量
        %B     the size in bytes of each block reported by %b , 以字节为单位输出%b所报告的每个块的大小
        %C     SELinux security context string,SElinux 安全上下文字符串
        %d     device number in decimal , 10进制设备编号
        %D     device number in hex , 16进制设备编号
        %f     raw mode in hex,16进制原始模式
        %F     file type,文件类型
        %g     group ID of owner ,文件所属组的组id
        %G     group name of owner,文件所属组的组名字
        %h     number of hard links,文件硬链接的个数
        %i     inode number,文件的索引编号(inode)
        %m     mount point,挂载点(有时候识别不了)
        %n     file name,文件名
        %N     quoted file name with dereference if symbolic link,如果是符号链接文件,会以符号链接文件指向原始文件,例如:‘test1233’ -> ‘anaconda-ks.cfg’
        %o     optimal I/O transfer size hint,IO块大小
        %s     total size, in bytes,文件总字节大小
        %t     major device type in hex, for character/block device special files,如果是特殊字符或者块设备,显示主设备号,如果不是,显示为0;
        %T     minor device type in hex, for character/block device special files,如果是特殊字符或者块设备,显示辅设备号,如果不是,显示为0;
        %u     user ID of owner,文件属主id
        %U     user name of owner,文件属主名
        %w     time of file birth, human-readable; - if unknown,文件创建时间,若未知则显示"-",CentOS 7添加的,CentOS 6系列没有这个属性
        %W     time of file birth, seconds since Epoch; 0 if unknown,从UNIX 元年起以秒计的文件创建时间,若未知则显示"0"
        %x     time of last access, human-readable,文件上一次的访问时间
        %X     time of last access, seconds since Epoch,从UNIX 元年起以秒计的上次访问时间
        %y     time of last modification, human-readable,文件上一次的修改时间
        %Y     time of last modification, seconds since Epoch,从UNIX 元年起以秒计的上次修改时间
        %z     time of last change, human-readable,文件上一次的改变时间
        %Z     time of last change, seconds since Epoch, 从UNIX 元年起以秒计的上次改变时间

        有效的文件系统输出格式:(以下自定义输出,在我们写脚本的时候非常有用)
         %a     free blocks available to non-superuser,非管理员用户剩余可用的块数量;
         %b     total data blocks in file system,文件系统总数据块数量;
         %c     total file nodes in file system,文件系统总节点数量;
         %d     free file nodes in file system,文件系统空闲节点数量;
         %f     free blocks in file system,文件系统空闲的块数量;
         %i     file system ID in hex,十六进制文件系统ID;
         %l     maximum length of filenames,允许文件名的最大长度;
         %n     file name,文件名
         %s     block size (for faster transfers),用于传输的传输的块大小
         %S     fundamental block size (for block counts),用于块计数的基本块大小;
         %t     file system type in hex,以16进制描述文件系统类型;
         %T     file system type in human readable form,以名字(很好理解的方式)描述文件系统类型,例如xfs,ext2/ext3等

正常的文件查看信息说明:
File:表示stat查看的文件名;
Size:表示stat查看的文件的大小;
Blocks:表示已经分配的块的数量,如果每个块512字节,那么一共4096字节;
IO Block:IO块大小;
regular file:表示查看的文件为常规文件
Device:16进制设备号/10进制设备号
Inode:stat查看的文件的inode编号;
Links:stat查看的文件的硬链接数;
Access:八进制权限/字符权限位(10位)
Uid:文件属主id编号/     文件属主名
Gid:文件属组id编号/     文件属组名
Context:SElinux 安全属性
Access:文件最近一次的访问时间(年-月 -日 时:分:秒.毫秒 时区)
Modify:文件最近一次的修改时间(年-月 -日 时:分:秒.毫秒 时区)
Change:文件最近一次的改变时间(年-月 -日 时:分:秒.毫秒 时区)
Birth:文件的创建时间,为"-"表示不识别;

正常的文件系统查看信息说明:
File:stat查看的文件名;
ID:十六进制文件系统ID;
Namelen:文件系统允许最大的文件名长度;
Type:文件系统类型;
Block size:用于传输的块大小;
Fundamental block size:基本块大小(用于块计算的)
Blocks:文件系统块统计信息,下面是说明
        Total:文件系统总数据块数量;
        Free:文件系统空余的块数量;
        Available:文件系统非管理员用户可用的块数量;
Inodes:文件系统的索引编号信息,下面是说明
        Total:文件系统总索引编号数量;
        Free:文件系统空余索引编号数量;
5.3、date命令 - 打印或设置系统日期和时间

date命令算是一个比较常用且适用的命令;比如我们临时修改系统时间,
自定义显示当前系统时间,时间日期格式转换,我们的date命令都可以
完成,下面我们一起来看看基本用法和选项:

  • 基本语法:
    date [OPTION]... [+FORMAT]
    date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]]

可以看出,选项和自定义格式都可以省略,我们简单的来看看示例:

[root@ACA86E6E ~]# date
Sat Sep  8 11:34:46 CST 2018
星期六缩写 9月缩写 8号 11时34分46秒 CST时间 2018年
  • 选项
    -d,--date=STRING:显示STRING部分描述的时间,不是默认的现在时刻。

关于选项中的STRING,man手册中的说明:

        The  --date=STRING  is  a  mostly free format human readable date string 
such as "Sun, 29 Feb 2004 16:21:42 -0800" or "2004-02-29 16:21:42" or even "next Thursday".  
        A date string may contain items indicating  calendar  date,  time  of day,  time  zone, day of week, 
relative time, relative date, and numbers.  
        An empty string indicates the beginning of the day.  The date string format is more complex 
than is easily documented here but is fully described  in  the  info documentation.
STRING设置比较灵活,可选值多样化,举几个常见的例子:

[root@ACA86E6E test1234]# date -d "Sun, 29 Feb 2004 16:21:42 -0800"
Mon Mar  1 08:21:42 CST 2004
[root@ACA86E6E test1234]# date -d "2004-02-29 16:21:42"
Sun Feb 29 16:21:42 CST 2004
[root@ACA86E6E test1234]# date -d "next Thursday"
Thu Sep 13 00:00:00 CST 2018

[root@ACA86E6E test1234]# date -d "2 days ago"
Thu Sep  6 12:45:14 CST 2018
[root@ACA86E6E test1234]# date
Sat Sep  8 12:45:16 CST 2018
[root@ACA86E6E test1234]# date
Sat Sep  8 12:45:27 CST 2018
[root@ACA86E6E test1234]# date && date -d "60 second ago"
Sat Sep  8 12:45:36 CST 2018
Sat Sep  8 12:44:36 CST 2018

[root@ACA86E6E test1234]# date && date -d '3 months 1 day'
Sat Sep  8 12:46:16 CST 2018
Sun Dec  9 12:46:16 CST 2018

-s, --set=STRING :设置成STRING描述的时间

我们主要常用的是查看,随机组合各个FORMAT格式选项,如下列出常见的选项:

%Y:年,4位的,例如2018;
%y:年,2位的,范围(00..99);
%m:月,不满两位带有0前缀的显示,例如09,范围(01..12);
%d :day of month,日期,不满两位带有0前缀的,例如08;
%F: full date; same as %Y-%m-%d    ,全日期,年-月-日;
%D:date; same as %m/%d/%y,月/日/两位年份;
%H:24制式的时,范围(00..23);
%I:12制式的时,范围(01..12);
%M:分钟,范围(00..59);
%S:秒,范围(00..60);
%T     time; same as %H:%M:%S;
%s:seconds since 1970-01-01 00:00:00 UTC,从1970年1月1日 00:00:00到目前经过的秒数;
%p:根据实际时间,判断是AM(上午)还是PM(下午)并显示出来,显示英文是大写的;
%P:根据实际时间,判断是am(上午)还是pm(下午)并显示出来,显示英文是小写的;
%w:判断今天是星期几,用0到6的数字表示,0表示周天;
%u:判断今天是星期几,用1到7的数字表示,1表示周1,7表示周天;

讲完这么多,我们回归我们这一节的主题,linux系统的三个时间属性:

  • 最近一次的文件的修改时间(mtime,modify time);
    文件内容如果有被编辑修改,该时间属性就会发生变化。在我们的ls ,stat,find工具都会用或者显示这个时间戳
    属性;
  • 最近一次I的文件的访问时间(atime,access time)
    文件的数据最后被访问,系统的进程直接使用文件或者一些工具,命令,脚本等间接使用。都可能会改变这个
    时间戳属性;
  • 最近一次的文件的改变时间(ctime,change time)
    这个文件的改变时间,是指文件的状态信息(元数据,metadata),像我们平常的文件的权限,从属关系,链接数等的变化都会影响这个属性戳属性,所以,编辑文件内容涉及文件元数据的变化,所以mtime变化,ctime一定会变化;至于文件的元数据一共有多少种,这个很多且复杂,我们在文件系统的时候会深入介绍。
5.4、设定系统时间与系统硬件时间
我们这里并不是时间与时钟的专题,只是简要说明hwclock的用法hwclock
hwclock
    -r,--show 查看硬件时间,打印至标准输出;
    -s,--hctosys 把硬件时间作为参考,同步至系统时间;
    -w,--systohc 把系统时间作为参考,同步至硬件时间;

[root@localhost ~]# date
Thu Sep 20 22:40:41 CST 2018
[root@localhost ~]# hwclock -r
Thu 20 Sep 2018 10:40:47 PM CST  -0.383177 seconds
[root@localhost ~]# hwclock --show
Thu 20 Sep 2018 10:40:51 PM CST  -0.136845 seconds
[root@localhost ~]# hwclock -s
[root@localhost ~]# hwclock --show
Thu 20 Sep 2018 10:41:17 PM CST  -0.845507 seconds
[root@localhost ~]# date
Thu Sep 20 22:41:17 CST 2018
[root@localhost ~]# hwclock -w
[root@localhost ~]# date
Thu Sep 20 22:41:27 CST 2018
[root@localhost ~]# hwclock --show
Thu 20 Sep 2018 10:41:36 PM CST  -0.876146 seconds  

可以利用date命令查看当前系统时间,如果不准,先校准系统时间,然后利用系统时间同步硬件时间。
当然,我们的虚拟机的硬件时间有时候不准,即使你本次调整了,下次还是会不准。在生产中,我们
一般是通过定时计划任务,利用时钟同步命令ntpdate来同步时间,校准系统时间,然后再校准硬件时间。

转载于:https://blog.51cto.com/9657273/2171648

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值