Shell设置文件读取流程

  /etc/shells记录了Linux系统中支持的所有shell,默认使用bash。用户登入Linux系统时会获取到一个shell,具体获取到哪个shell与登录账号有关,/etc/passwd中每个账号信息中最后一个信息记录的就是该账号登入系统会获取到的shell。

  获取到shell之后,shell会在启动时读取一些设置文件。具体读取了哪些设置文件又要分login shell和non-login shell(顾名思义,就是需要登录的shell和不需要登录的shell)两种情况。

  login shell会读取/etc/profile和~/.bash_profile或~/.bash_login或~/.profile这两个文件,前者为系统全局设置,后者为当前用户个人设置。具体流程图如下(图借自鸟哥,为centos7设置文件读取流程):

/etc/profile做的事情:

1. 定义一些环境变量:

PATH、MAIL、USER、HOSTNAME、HISTSIZE、umask,等等。

2. 读取其他设置文件:

(1)/etc/profile.d/*.sh:规范了bash操作界面的颜色、语系、ll与ls指令的命令别名、vi的命令别名、which的命令别名,等等。

(2)/etc/locale.conf:由/etc/profile.d/lang.sh读入,设置bash默认使用的语系。(centos7以前版本为/etc/sysconfig/i18n)

(3)/usr/share/bash-completion/completions/*:由/etc/profile.d/bash_completion.sh读入,设置了命令补齐、文件名补齐等功能。

  bash读取全局设置文件/etc/profile之后会读取当前登录用户的个人设置文件,按顺序读取~/.bash_profile、~/.bash_login、~/.profile的其中一个。

~/.bash_profile做的事情:

1. 读取~/.bashrc:这个文件定义了一些命令别名,读入了/etc/bashrc(这个文件定义了PS1、umask,读入/etc/profile.d/*.sh)。

2. 将~/bin这个目录加入到PATH中。

  non-login shell的设置文件读取流程只是login shell的一部分,从读入~/.bashrc开始。

———————————————————————————————————————————————————————————————————————

指令执行历史:history与~/.bash_history

history:查看当前登录用户执行命令的历史记录。

~/.bash_history:记录当前用户执行命令的历史记录。

history -r:从~/.bash_history读取数据到内存供history指令使用。

history -w:将内存数据写入~/.bash_history中。

history -c:将内存中的指令历史记录清除(不会影响~/.bash_history)。

  用户登入系统时bash会从~/.bash_history中读取数据到内存供history指令使用,登出系统时则将内存中的数据写入~/.bash_history中。若用户在多个终端登录了同一个账号,则每一次登出系统都会写一下文件,最后登出的终端的内存数据会覆盖其它所有终端写入的数据。

几个相关变量:

HISTFILE:~/.bash_history文件的绝对路径。

HISTSIZE:history指令最多输出的指令数量(在/etc/profile中定义)。

HISTFILESIZE:~/.bash_history文件中记录的最多指令数量。(若HISTSIZE<HISTFILESIZE,则history读取的是~/.bash_history文件中最后HISTSIZE条指令记录。)

HISTTIMEFORMAT:history指令输出默认只有序号和指令名称,定义这个变量可以使其输出指令执行的时间。使用示例如下:

在~/.bashrc文件最后两行配置:

配置之后记得使用source ~/.bashrc使配置立即生效,最后输出结果如下:

————————————————————————————————————————————————————————————————————————

语系设置:locale与/etc/locale.conf

locate:查询Linux系统当前语系设置,查询结果及各个变量说明如下图所示。

  语系设置参数的优先级:LC_ALL > LC_* > LANG。其中LANG是所有变量的默认设置,12个LC_*变量中,没有设置值的变量都将使用LANG的值。如果设置了LC_ALL,则所有的LC_*变量都将使用LC_ALL的值,不管自身的值是什么。所以当LC_ALL设置了值之后,所有LC_*变量进行其他值设置都是无效的,除非先将LC_ALL设置为空。

  设置这些变量时,设置之后需要执行export指令将其声明为全局变量才能生效,例如:export LC_TIME=”zh_CN.UTF-8”。然而这样设置也只能在本次登录系统期间生效,下次登录就又回到原来的值了,若想永久生效,需要将其配置写入/etc/locale.conf(centos7之前版本为/etc/sysconfig/i18n)文件中,然后重新登录即可生效,若不想重新登录则需要执行source指令重新读取这个文件,然后再执行export指令将设置的变量转为环境变量才能生效。

locale -a:查询当前Linux系统支持的所有语系。

  该命令输出的每一种语系都对应/usr/lib/locale目录(centos7之前版本为/usr/share/i18n/locales)下的一个文件,这些文件就是对每一个语系的配置。可以查看其中一个文件例如zh_CN,可以看到里面使用Unicode编码定义了每一个LC_*变量的输出,例如LC_TIME变量中对于星期几的定义如下:

由上到下分别是“星期日”、“星期一”....直到“星期六”的定义。

—————————————————————————————————————————————————————————————————————

别名:alias与unalias

alias:查看当前所有命令别名定义(这些命令别名可能在设置文件中定义,如:~/bashrc,也可以是使用alias指令定义的)。

所以,执行cp就相当于执行cp -i。

  alias指令用于定义命令别名,unalias用于取消命令别名,这里定义举一个例子,设置mkdir指令别名为mkd示例如下:

然而,使用alias定义的命令别名只是在本次登录系统过程中有效,若想永久生效则应该写入到设置文件中,例如可以写入~/.bashrc中。

  为什么定义了命令别名之后就可以使用别名来执行命令了呢?这跟Linux系统中指令运行的顺序有关,Linux指令运行顺序如下:

1. 以相对/绝对路径运行指令。

2. 由alias找到指令执行。

3. 由bash内建的指令执行。

4. 使用$PATH变量中的路径搜索到第一个指令执行。

  使用type指令可以查看某个指令的类型,使用type -a则可以查看某个指令的执行顺序,如type -a ls

———————————————————————————————————————————————————————————————————————

一些特殊用途设置文件

  /etc/issue/etc/issue.net中的内容会在启动系统之后登录系统之前显示在屏幕上,其中/etc/issue设置的是在本地终端启动系统后展示的信息,而/etc/issue.net则是在远程连接主机时展示的信息。文件中可使用的转义字符及其意义如下(图借自鸟哥):

  /etc/issue.net文件想要生效还需要修改ssh配置文件/etc/ssh/sshd_config中的Banner字段,需要将其值改为/etc/issue.net,然后重启ssh服务。

  /etc/motd文件写入的则是登录系统之后显示的内容,而且不支持上述转义字符。

  ~/.bash_logout文件记录了登出bash之后,系统需要执行的动作,可以在这里进行数据备份、情况缓存等动作。

——————————————————————————————————————————————————————————————————————

一些变量相关指令

echo:输出变量的值,例如:echo $PATH.

unset:取消某个变量。

env:查看所有环境变量。

set:查看所有变量(包括环境变量和自定义变量)。’

选项参数:

-u:默认不启用,启用之后,使用未定义变量会显示错误信息。

-v:默认不启用,启用之后,输出信息之前先显示信息的原始内容。

-x:默认不启用,启用之后,执行指令之前会先显示指令内容。

可以使用echo $-查看所有的set设定值。

还有其他参数。。。

export:查看所有环境变量;将自定义变量转成环境变量。

declare:声明变量类型。

选项参数:

-a:声明变量为数组类型。

-i:声明变量为整形。

-x:将变量转为环境变量,功能与export相同。

-r:将变量设置为readonly类型,不可修改,也不能unset。

typeset:功能与declare功能相同。

stty -a:查看所有快捷键与其意义。(stty也可用于设置快捷键,设置方法参考stty -a输出内容)

————————————————————————————————————————————————————————————————————————

一些常用环境变量

-:所有的set设定值。

$:当前shell的PID

?:前一个指令执行的返回值,若为0表示正确执行,否则表示有错误。

HOME:当前用户家目录。

SHELL:当前使用的shell。

MAIL:使用mail指令收信时,系统读取的邮件信箱文件。

RANDOM:随机数。

PATH:执行指令文件的搜索路径。

PS1:命令行提示字符串。

Linux设置文件与Shell操作环境的更多相关文章

  1. 【linux之文件查看,操作】

    一.shell如何处理命令 1.shell会根据在命令中出现的空格字符,将命令划分为多个部分 2.判断第一个字段是内部命令还是外部命令 内部命令:内置于shell的命令(shell builtin) ...

  2. 【linux之文件查看,操作,权限管理】

    一.shell如何处理命令 1.shell会根据在命令中出现的空格字符,将命令划分为多个部分 2.判断第一个字段是内部命令还是外部命令 内部命令:内置于shell的命令(shell builtin) ...

  3. shell 编程 && bash 简介(shell 变量、shell操作环境、数据流重导向、管线命令、shell script)

    如何学习一门编程语言 数据类型 运算符 关键字 1 认识BASH 这个shell linux是操作系统核心,用户通过shell与核心进行沟通,达到我们想要的目的.硬件.核心.用户之间的关系: 原理:所 ...

  4. linux中文件I/O操作(系统I/O)

    我们都知道linux下所有设备都是以文件存在的,所以当我们需要用到这些设备的时候,首先就需要打开它们,下面我们来详细了解一下文件I/O操作. 用到的文件I/O有以下几个操作:打开文件.读文件.写文件. ...

  5. java通过sftp对linux服务器文件夹进行操作

    本文主要讲sftp对linux服务器的文件和文件夹进行操作,windows server 服务器不支持. package com.lx.ftp; import java.io.File; import ...

  6. Linux(六)shell操作实用技巧

    一.shell操作日期时间 linux 系统为我们提供了一个命令 date,专门用来显示或者设置系统日期时间的.      语法格式为:      date [OPTION]... [+FORMAT] ...

  7. 记一次为解决Python读取PDF文件的Shell操作

    目录 一.背景 二.问题 三.解决 四.一顿分析及 Shell 操作 五.后续 一.背景 本想将 PDF 文件转换为 Word 文档,然后网上搜索了一下发现有挺多转换的软件.有的是免费的.收费,咱也不 ...

  8. Linux设置文件权限和归属

    前言:在Linux文件系统的安全模型中,为系统中的文件(或目录)赋予了两个属性:访问权限和文件所有者,简称为“权限”和“归属”.其中,访问权限包括读取.写入.可执行三种基本类型,归属包括属主(拥有该文 ...

  9. Linux设置文件读写权限

    设置文件夹的读写权限: sudo chmod -R 777 /data 权限码描述 sudo chmod 600 ××× (只有所有者有读和写的权限)sudo chmod 644 ××× (所有者有读 ...

随机推荐

  1. 计算机图形学(Conputer Graphics):非均匀有理B样条

    计算机图形学(Conputer Graphics):非均匀有理B样条 非均匀有理B样条(Non-Uniform Rational B-Spline)英文缩写,NURBS. 它是贝塞尔曲线的一个推广,而 ...

  2. 【page-monitor 前端自动化 下篇】 实践应用

    转载文章:来源(靠谱崔小拽) 通过page-diff的初步调研和源码分析,确定page-diff在前端自动化测试和监控方面做一些事情.本篇主要介绍下,page-diff在具体的实践中的一些应用 核心d ...

  3. CPP-基础:C++拷贝构造函数详解

    一. 什么是拷贝构造函数 首先对于普通类型的对象来说,它们之间的复制是很简单的,例如: ; int b = a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量.下面看一个类对象 ...

  4. Java中的线程--多线程面试题

    到这里,基本上线程的并发中的知识点都是学到了,到了最后,还有三道面试题,从面试题中学习更加的加深一下,多线程中的知识点,如何在实际的问题中来解决多线程的问题,可以更好的从实际出发 一.面试题1 面试题 ...

  5. css去除链接 input 虚框

    /* css去掉虚框 */ :focus{-webkit-outline-style:none;-moz-outline-style:none;-ms-outline-style:none;-o-ou ...

  6. JS与IOS、安卓的交互

    最近做的项目中涉及到了与安卓和ios的交互问题,对于一个新手来说,多多少少会有点迷糊.在调用安卓和ios的callback回调时,很轻松的就调用成功了,而且,步骤也不那么繁琐.刚开始,只知道那样使用可 ...

  7. [LUOGU] 1717 钓鱼

    题目描述 话说发源于小朋友精心设计的游戏被电脑组的童鞋们藐杀之后非常不爽,为了表示安慰和鼓励,VIP999决定请他吃一次"年年大丰收",为了表示诚意,他还决定亲自去钓鱼,但是,因为 ...

  8. 004 html常用标签

    html常用标签 1.无语义标签 <div></div> <span></span> 2.常用语义标签 <hn></hn> 标题 ...

  9. PHP开发中涉及到emoji表情的几种处理方法!

    emoji表情 处理 一般Mysql表设计时,都是用UTF8字符集的.把带有emoji的昵称字段往里面insert一下就没了,整个字段变成了空字符串.这是怎么回事呢? 原来是因为Mysql的utf8字 ...

  10. 【转】4w+1h 教你如何做用户画像

    记得14年开始做用户画像的时候,对于用户画像完全没有概念,以为是要画一幅幅图画,经过两年多的学习和理解,渐渐的总结出了一些方法和技巧,在这里就通过4个W英文字母开头和1个H英文字母开头的单词和大家分享 ...