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. LeetCode || 双指针 / 单调栈

    11. Container With Most Water 题意:取两根求最大体积 思路:使用两个指针分别指向头和尾,然后考虑左右两根: 对于小的那根,如果选择了它,那么能够产生的最大体积一定是当前的 ...

  2. 安装VC++6.0实验环境

    安装VC++6.0步骤:(1)下载一个压缩包进行解压(2)点击打开解压后的文件(3)找到文件里的程序进行安装(4)等待安装完成该程序后可以试着运行一下此程序,在此我们需要了解编写程序的步骤和注意事项. ...

  3. Clover启动mbr的win7/win8

    对以传统bios安装在mbr分区的win7/WIN8也可以使用EFI引导直接进入win.首先进win提取EFI引导文件,以管理员员身份运行cmd,输入如下命令 bcdboot c:\windows / ...

  4. java面试宝典第四弹

    动态代理 1. 什么是代理 我们大家都知道微商代理,简单地说就是代替厂家卖商品,厂家“委托”代理为其销售商品.关于微商代理,首先我们从他们那里买东西时通常不知道背后的厂家究竟是谁,也就是说,“委托者” ...

  5. 【数位dp】bzoj1799: [Ahoi2009]self 同类分布

    各种奇怪姿势的数位dp Description 给出a,b,求出[a,b]中各位数字之和能整除原数的数的个数. Sample Input 10 19 Sample Output 3 HINT [约束条 ...

  6. windows 使用git上传代码至github

    1. 首先创建github账户 2. 创建github项目 3.  windows安装git工具 ·下载地址:https://git-for-windows.github.io/ ,下载直接安装即可, ...

  7. Python操作微信跳一跳

    “跳一跳”这个东西还是今天刚接触到的,看到了python群中有人再问“微信跳一跳的外挂有人写了没”,“早就有了”,“github”,“等着出个更详细的教程教程没看懂,主要没有用过adb”. 不过没关系 ...

  8. 王小胖之 Base64编码/解码

    使用场景:编码网址作为URL参数,简单编码或加密数据,下载地址生成或解析. 实现功能:BASE64在线编码和解码. 数据实例:王小胖好啊,王小胖顶呱呱!! ~~ english 123 !@#$%^& ...

  9. 一、Numpy库与多维数组

    # Author:Zhang Yuan import numpy as np '''重点摘录: 轴的索引axis=i可以理解成是根据[]层数来判断的,0表示[],1表示[[]]... Numpy广播的 ...

  10. day12-图