1. 程式人生 > >5、【Linux系統編程】環境變量

5、【Linux系統編程】環境變量

第一次 的區別 nvi 用戶目錄 mail 操作 key 推薦 一行

前言

  1. 環境變量是操作系統環境設置的變量,適用於整個系統的用戶進程;

  2. 環境變量可以在命令中設置,但是用戶註銷的時候將會丟失這些設置值;

  3. 若要重復適用,則最好在.profile中定義;環境變量的使用與本地變量的使用方法相同,

  4. 但是在使用之前,必須用export命令導出。

一、環境變量文件介紹

  Linux中環境變量包括系統級和用戶級,系統級的環境變量是每個登錄到系統的用戶都要讀取的系統變量,而用戶級的環境變量則是該用戶使用系統時加載的環境變量,所以管理環境變量的文件也分為系統級和用戶級的。

二、Linux的變量種類

按變量的生存周期來劃分,Linux變量可分為兩類:

  1.永久的:需要修改配置文件,變量永久生效

  2.臨時的:使用export命令聲明即可,變量在關閉shell時失效

三、Linux 環境變量文件

linux變量文件有/etc/environment 或 /etc/profile 或 ~/.profile 或 /etc/bash.bashrc 或 ~/.bashrc, 以及~/.bash_profile(一般是用戶在自己目錄下新建的),~/.bash_logout.

系統級:

1./etc/environment

  是系統在登錄時讀取的第一個文件,該文件設置的是整個系統的環境,只要啟動系統就會讀取該文件,用於為所有進程設置環境變量。系統使用此文件時並不是執行此文件中的命令,而是根據而是根據KEY=VALUE模式的代碼,對KEY賦值以VALUE,因此文件中如果要定義PATH環境變量,只需加入一行形如 PATH=$PATH:/xxx/bin的代碼即可

2./etc/profile

  此文件是系統登錄時執行的第二個文件。 為系統的每個用戶設置環境信息,當用戶第一次登錄時,該文件被執行。並從/etc/profile.d目錄的配置文件中搜集shell的設置。(/etc/profile可以用於設定針對全系統所有用戶的環境變量,環境變量周期是永久性)

3. /etc/bash.bashrc

  是針對所有用戶的bash初始化文件,在此中設定的環境變量將應用於所有用戶的shell中,此文件會在用戶每次打開shell時執行一次。(即每次新開一個終端,都會執行/etc/bash.bashrc)。

用戶級(這些文件處於家目錄下):

1. ~/.profile

  對應當前登錄用戶的profile文件,用於定制當前用戶的個人工作環境(變量是永久性),每個用戶都可使用該文件輸入專用於自己使用的shell信息,當用戶登錄時,該文件僅僅執行一次!默認情況下,他設置一些環境變量,執行用戶的.bashrc文件。這裏是推薦放置個人設置的地方

2.~/.bashrc

  該文件包含專用於你的bash shell的bash信息,當登錄時以及每次打開新的shell時,該文件被讀取。(~/.bashrc只針對當前用戶,變量的生命周期是永久的)

不推薦放到這兒,因為每開一個shell,這個文件會讀取一次,效率肯定有影響。

3.~/.bash_profile or ~./bash_login

  ~/.bash_profile是交互式login 方式進入 bash 運行的,~/.bashrc 是交互式 non-login 方式進入 bash 運行的通常二者設置大致相同,所以通常前者會調用後者每個用戶都可使用該文件輸入專用於自己使用的shell信息,當用戶登錄時,該文件僅僅執行一次。默認情況下,他設置一些環境變量,執行用戶的.bashrc文件。(如果~/目錄下沒有.bash_profile則新建立一個)這裏是推薦放置個人設置的地方(但是,我在Ubuntu的系統下,並沒有發現這兩個文件)。

當一個shell關閉時,在bash_profile中定義的系統變量則會失效。因此,每打開一個新的shell時都要運行一次source bash_profile.而且針對當前用戶。

4.~/.pam_environment

  用戶級的環境變量設置文件,沒有做測試,不知道管不管用。(在Ubuntu系統下,同樣沒有看到這個文件)

5.~/.bash_logout

  當每次退出系統(退出bash shell)時,執行該文件。另外,/etc/profile中設定的變量(全局)的可以作用於任何用戶,而~/.bashrc等中設定的變量(局部)只能繼承 /etc/profile中的變量,他們是"父子"關系。

四、Linux 環境變量文件執行順序

1. 在登錄Linux時要執行文件的過程如下:

在剛登錄Linux時,

首先啟動 /etc/profile 文件,

然後再啟動用戶目錄下的 ~/.bash_profile、 ~/.bash_login或 ~/.profile文件中的其中一個,用戶主目錄下文件的執行的順序為:  

1   ~/.bash_profile  ->  ~/.bash_login  ->  ~/.profile。

如果 ~/.bash_profile文件存在的話,一般還會執行 ~/.bashrc文件。

因為在 ~/.bash_profile文件中一般會有下面的代碼:

1 if [ -f ~/.bashrc ] ; then
2    . ./bashrc
3 fi

~/.bashrc中,一般還會有以下代碼:

1 if [ -f /etc/bashrc ] ; then
2    . /etc/bashrc
3 fi

所以,~/.bashrc會調用 /etc/bashrc文件。最後,在退出shell時,還會執行 ~/.bash_logout文件。

執行順序為:

/etc/profile -> (~/.bash_profile | ~/.bash_login | ~/.profile) -> ~/.bashrc -> /etc/bashrc -> ~/.bash_logout

/etc/profile和/etc/environment等各種環境變量設置文件的用處

  1)先將export LANG=zh_CN加入/etc/profile,退出系統重新登錄,登錄提示顯示英文。

  2)先將/etc/profile 中的export LANG=zh_CN刪除,將LNAG=zh_CN加入/etc/environment,退出系統重新登錄,登錄提示顯示中文。

用戶環境建立的過程中總是先執行/etc/profile,然後再讀取/etc/environment。

為什麽會有如上所敘的不同呢?而不是先執行/etc/environment,後執行/etc/profile呢?

這是因為: /etc/environment是設置整個系統的環境,而/etc/profile是設置所有用戶的環境,前者與登錄用戶無關,後者與登錄用戶有關。

系統應用程序的執行與用戶環境可以是無關的,但與系統環境是相關的,所以當你登錄時,你看到的提示信息,如日期、時間信息的顯示格式與系統環境的LANG是相關的,缺省LANG=en_US,如果系統環境LANG=zh_CN,則提示信息是中文的,否則是英文的。

對於用戶的shell初始化而言是先執行/etc/profile,再讀取文件/etc/environment;對整個系統而言是先執行/etc/environment。這樣理解正確嗎?

登陸系統時的順序應該是:

/etc/enviroment --> /etc/profile -->HOME/.profile??>HOME/.env (如果存在)

/etc/profile 是所有用戶的環境變量 /etc/enviroment是系統的環境變量

登陸系統時shell讀取的順序應該是:

/etc/profile ->/etc/enviroment -->HOME/.profile??>HOME/.env

原因應該是用戶環境和系統環境的區別了,如果同一個變量在用戶環境(/etc/profile)和系統環境(/etc/environment)有不同的值,那應該是以用戶環境為準了。

五、Linux中常見的環境變量及其作用

Linux中常見的環境變量有:

  1.PATH:指定命令的搜索路徑

  2.HOME:指定用戶的主工作目錄(即用戶登陸到Linux系統中時,默認的目錄)

  3.HISTSIZE:指保存歷史命令記錄的條數。

  4.LOGNAME:指當前用戶的登錄名。

  5.HOSTNAME:指主機的名稱,許多應用程序如果要用到主機名的話,通常是從這個環境變量中來取得的。

  6.SHELL:指當前用戶用的是哪種Shell。

  7.LANG/LANGUGE:和語言相關的環境變量,使用多種語言的用戶可以修改此環境變量。

  8.MAIL:指當前用戶的郵件存放目錄。

  9.PS1:命令基本提示符,對於root用戶是#,對於普通用戶是$。

  10.PS2:附屬提示符,默認是“>”。

備註:可以通過修改此環境變量來修改當前的命令符,比如下列命令會將提示符修改成字符串“Hello,MyNewPrompt ”。

# PS1="Hello,My NewPrompt"

註意:上述變量的名字並不固定,如HOSTNAME在某些Linux系統中可能設置成HOST

當然,這裏列舉的上述環境變量並非窮盡列出!

Linux也提供了修改和查看環境變量的命令!下面通過幾個實例來說明:

  1.echo 顯示某個環境變量值 echo $PATH

  2.export 設置一個新的環境變量 export HELLO="hello" (可以無引號),在shell的命令行下直接使用[export 變量名=變量值] 定義變量,該變量只在當前的shell(BASH)或其子shell(BASH)下是有效的,shell關閉了,變量也就失效了,再打開新shell時就沒有這個變量,需要使用的話還需要重新定義。

  3.env 顯示所有環境變量

  4.set 顯示本地定義(系統中已經存在)的shell變量以及設置shell變量的新變量值,如果未指定值,則該變量值將被設為NULL。

  5.unset 清除環境變量 unset HELLO

  6.readonly 設置只讀環境變量 readonly HELLO ,如果使用了readonly命令的話,變量就不可以被修改或清除了

5、【Linux系統編程】環境變量