介绍
了解Linux的启动顺序,也有助于本内容的理解,加载用户环境是Linux启动的最后一步。不同的shell 会使用不同的配置文件: bash (.profile), ksh (.profile), csh (.login)。
bash shell 被设计成兼容sh, ksh, 它会在用户主目录依次检查.bash_profile,.bash_login,.profile是否存在,并加载找到的第一个文件。无论文件名字如何,加载用户环境的原理一样,只设定一个配置文件即可。但若有兼容bash,ksh的需要,只配置.profile即可。若在用户登录后,修改了bash的配置文件,用户可以手动加载文件生效,如 . /etc/profile . ~/.bash_profile
/etc/skel目录中有.bash_profile .bashrc ,当建立新用户时, /etc/skel中的所有文件会被复制一份放在用户的家目录中,用来设定用户环境。
概念
shell 环境脚本:管理bash 环境的最佳方案,就是通过/etc/profile.d/*.sh , /etc/profile.d/ 中*.sh 文件是用来存储应用软件的profile, 用来配置相应软件的环境变量。而不是直接修改/etc/profile.
子shell : 为什么让脚本或命令在子shell 中运行?因为启动子shell会创建一个全新的独立的执行环境,在子shell 中运行所发生的改变不会影响到父shell 环境。
加载文件:与编程上使用include同样的原理,即在定义的位置将指定的文件插入当前文件。bash shell 允许用户将多个命令集中在一个文件中,然后执行这些命令,与直接在提示符下键入执行效果相同,这个过程称为加载文件。加载文件的命令执行在当前shell 中,并可能修改当前shell 环境,获得文件的命令是shell 的内置命令source (. 是source 命令的同义词)
登录shell :以bash --login 方式启动的shell,登录到一台机器上看到的第一个shell ,登录到虚拟控制台,远程登录,启动X的看不见的shell等。用户登录时激活的shell, 在/etc/passwd 中设定
非登录shell : 以bash方式启动的shell 除登录shell以外均是非登录shell, 如X图形下开启的新终端,子shell, ,括号命令分组,执行shell 脚本时创建的新的非登录shell.用户登录后手动执行的shell 程序
交互式shell : 手动启动的子shell ,新开的X终端等
非交互式shell :以shell脚本形式启动,命令替换而调用的shell等,为避免潜在的启动脚本副作用,非交互式shell不在启动时加载启动脚本
不同方式使用shell时环境的加载
交互式登录shell
登录分为local login 和 remote login,bash在用户登录时从四个文件中读取环境设定:
登录shell先加载/etc/profile(全局设定,此文件也可在执行时获得其它文件) , 然后在用户主目录按.bash_profile .bash_login .profile的优先次序执行其中一个文件,登录shell logout时,若主目录中有.bash_logout,则执行.
加载顺序:
/etc/profile > /etc/profile.d/*.sh>~/.bash_profile (.bash_login, .profile) > ~/.bashrc > /etc/bashrc
全局设置文件:
① /etc/profile
② /etc/bashrc
当前用户设置文件:
③ ~/.bash_profile独立用户的配置文件
④~/.bashrc #如使永久生效的别名命令,即可将别名配置写入此文件,用户登录shell时,执行其中的命令(用户用于自定义shell)
交互式非login shell(执行新shell)
.bashrc使用户登录时的环境变量设置与子shell的环境变量设置相分离,有独立的执行环境。
加载~/.bashrc, 而此文件默认仅加载/etc/bashrc, ~/.bashrc>/etc/bashrc>/etc/profile.d/*.sh
非交互式非登录shell
先检查变量BASH_ENV, 若有定义 ,则先执行其所定义的启动文件的内容,然后再执行脚本。默认不加载任何启动文件
以sh 文件名调用bash
仿照旧版的sh,尽量兼容于POSIX标准(bash特有功能将丧失)
loginshell 调用/bin/sh,bash 会读取/etc/profile和~/.profile
交互式shell:执行/bin/sh, fork 一个子shell ,检查并执行ENV变量中定义的内容.
执行shell script : 第一行为#!/bin/sh 里, bash 不执行任何配置文件.
以bash --posix 方式执行
bash 使用与POSIX标准兼容功能,检查并执行ENV变量中定义的内容.
执行 bash -r 或以rbash的名称调用
受限模式,bash功能受限,目的是让用户拥有少数功能,出于安全考虑. 此模式会执行~/.bashrc
相关档
/etc/profile:所有用户登录都会执行,设定的变量(全局)的可以作用于所有用户,由root统一维护
/etc/bashrc:针对所有交互式shell
/etc/skel: 目录中含有针对所有用户的初始化文件
用户可以自定义的一些文件:
~/.bash_profile: 当前用户环境配置。每个用户都可使用该文件输入专用于自己使用的shell环境,当用户登录时,该文件仅仅执行一次!是以交互式login文件运行bash的
~/.bashrc :该文件包含专用于设定当前用户shell环境,当登录以及每次打开新的shell时,该文件被读取,是交互式non-login方式运行bash的。
~/.bash_logout用户登录时执行,默认仅执行clear 命令