介紹shell
瞭解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中的全部文件會被複制一份放在用戶的家目錄中,用來設定用戶環境。bash
概念ide
shell 環境腳本:管理bash 環境的最佳方案,就是經過/etc/profile.d/*.sh , /etc/profile.d/ 中*.sh 文件是用來存儲應用軟件的profile, 用來配置相應軟件的環境變量。而不是直接修改/etc/profile.spa
子shell : 爲何讓腳本或命令在子shell 中運行?由於啓動子shell會建立一個全新的獨立的執行環境,在子shell 中運行所發生的改變不會影響到父shell 環境。設計
加載文件:與編程上使用include一樣的原理,即在定義的位置將指定的文件插入當前文件。bash shell 容許用戶將多個命令集中在一個文件中,而後執行這些命令,與直接在提示符下鍵入執行效果相同,這個過程稱爲加載文件。加載文件的命令執行在當前shell 中,並可能修改當前shell 環境,得到文件的命令是shell 的內置命令source (. 是source 命令的同義詞)blog
登陸shell :以bash --login 方式啓動的shell,登陸到一臺機器上看到的第一個shell ,登陸到虛擬控制檯,遠程登陸,啓動X的看不見的shell等。用戶登陸時激活的shell, 在/etc/passwd 中設定ip
非登陸shell : 以bash方式啓動的shell 除登陸shell之外均是非登陸shell, 如X圖形下開啓的新終端,子shell, ,括號命令分組,執行shell 腳本時建立的新的非登陸shell.用戶登陸後手動執行的shell 程序rem
交互式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 命令