■ 變量與環境變量linux
shell環境一般存在不少變量,變量能夠經過echo $VAR或${VAR}的方式查看。set命令能夠查看當前環境中的全部變量(包括通常的自定義變量和環境變量)shell
變量的設置經過簡單的賦值命令進行。好比TESTVAR=abc,就是設置了TESTVAR的值爲abc(注意等號兩邊都沒有空格,值也不能有空格,有空格就要用引號引發來)。centos
取消變量的設置能夠經過unset命令,如unset TESTVAR。bash
變量中有一些特殊的變量被稱爲環境變量。環境變量的意義在於它能夠被子進程繼承,繼而被多個進程共用。因爲linux的子進程生成機制是fork-and-exec,因此子進程的環境變量實際上是父進程的一個副本,子進程開始運行後就與父進程互相獨立了。經過export命令能夠將通常的自定義變量轉化爲環境變量用於進程間通信。env命令能夠查看全部環境變量。ssh
■ shell配置文件與環境變量繼承
經過SSH鏈接centos是一個常見的場景。登陸時,由sshd進程打開一個虛擬終端的子進程,再由虛擬終端進程打開一個bash子進程,這個bash進程就是咱們經過這個鏈接運行全部指令的原點。接口
順帶一提,打開bash時會有歡迎信息,這些信息配置在/etc/issue(經過終端登陸時)和/etc/motd(經過模擬終端登陸時)。進程
在正式看bash的配置文件以前,有必要先了解一下login-shell和non-login-shell。從最表象的層面來講,打開bash時須要輸入帳號密碼的shell就是login-shell,反之則不是。前者例子有經過終端登陸linux系統或者SSH遠程登陸模擬終端時,後者的例子有經過圖形化界面打開終端,或者在終端中運行bash再開一個子進程的shell等狀況。內存
在cenots下打開一個bash的shell時,會讀取一些配置文件,加載一些基本的,經常使用的變量到shell中來。一般會涉及到的配置文件主要有四個:同步
A. /etc/profile
B. ~/.bash_profile
C. ~/.bashrc
D. /etc/bashrc
一般,打開的是一個login-shell的時候會加載的配置文件是A和B。(說B是隻有一個.bash_profile其實也是不太嚴謹的。若是home中.bash_profile不存在則會尋找.bash_login,若它也不存在則尋找.profile。三者按照優先級順序找到一個就加載,其餘的就無論了)可是一般,B的具體執行內容中有加載C的步驟,而C的執行內容中又有加載D的步驟,因此通常而言四個都會被加載。因爲B和C是每一個用戶home目錄下自身的文件,可能有所不一樣,這點也須要注意。相對的A是全部用戶共用的文件。
若打開的是一個non-login-shell的話,那麼只會加載C和D。值得一提的是,D這個文件是redhat系統特有的文件,在其中作出了redhat標誌性的一些配置(好比PS1的樣式)。C這個文件在/etc/skel中有備份,若是不當心刪除了能夠去那裏拿一份回來。
除了上面四個外,還有一些配置文件也和bash的運行息息相關。
~/.bash_history 記錄了當前bash的命令執行歷史,其大小和環境變量HISTSIZE相關。history命令就是讀取這個文件的。歷史命令並不會隨着咱們操做同步寫入,咱們能夠想象是這樣的:登陸時讀取這個文件把HISTSIZE條命令加載到內存中,因爲HISTSIZE一般是1000,以1000舉例。而後隨着咱們不斷輸入命令,內存中這1000條不斷被更新,總量始終維持在1000。當咱們註銷登陸時將這更新後的1000條再次寫入此文件。因爲命令記錄和bash進程相關聯,可是.bash_history一個用戶只有一個,因此當同一個用戶用不一樣bash進程作了不一樣操做的時候,更新的信息以最後一個註銷的用戶爲準。
~/.bash_logout 註銷登陸時留給用戶作一些事的接口。咱們能夠在裏面寫上一些註銷登陸時要機器自動幫你作的事情,好比記錄登出的時間等等。
■ 幾種運行可執行程序(包括運行sh腳本)的區別
對於可執行文件,Linux提供了多種執行方法,按照分類主要有:
1. 經過路徑執行如相對or絕對路徑:./test.sh 、/tmp/test.sh
這種執行方法須要當前用戶對被執行的文件有執行的權限,且若是是一個shell腳本的話在腳本頭應該聲明相應的解釋器如#!/bin/bash。從執行程序的角度而言經過相對或絕對路徑執行沒有區別。
因爲通常命令的執行本質也是先找到環境變量PATH中的相關路徑再執行,因此能夠視爲這一類執行方式。所以,通常命令的執行也都是開了一個子進程的shell來執行的。
2. shell命令執行
經過shell程序的指令執行如: bash test.sh、sh test.sh
經過這種方法執行的程序自己無需有執行權限,只要有讀權限便可。被執行程序做爲一個shell程序的參數運行。
3. 以讀取環境變量的方式執行
如: source test.sh 、 . test.sh
這種方式和前兩種最大的區別在於,前兩種都是在現有shell中開啓一個子進程的shell,而後把程序放到子進程的shell環境中執行,執行完成後即關閉子進程shell。而這種方式直接在當前shell環境中執行。因此若是被執行程序中含有對環境變量的增改,且但願保留結果到當前shell環境中的,則須要使用這種方法執行。