Linux環境變量詳解

Linux環境變量詳解

環境變量是操作系統環境設置的變量,適用于整個系統的用戶進程。

環境變量分類

按照權限分類

  • 系統級:系統級的環境變量是每個登錄到系統的用戶都要讀取的系統變量
  • 用戶級:用戶級的環境變量則是該用戶使用系統時加載的環境變量

按照生存周期分類

  • 永久的:需要修改配置文件,變量永久生效
  • 臨時的:使用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/bashrc:是針對所有用戶的bash初始化文件,在此中設定的環境變量將應用于所有用戶的shell中,此文件會在用戶每次打開shell時執行一次。(即每次新開一個終端,都會執行/etc/bashrc)。

用戶級

(這些文件處于主目錄下)

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

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

  3. ~/.bash_profile or ~/.bash_login or /.profile。**/.bash_profile是交互式login方式進入 bash 運行的,~/.bashrc 是交互式 non-login 方式進入 bash 運行的。通常二者設置大致相同,所以通常前者會調用后者。**每個用戶都可使用該文件輸入專用于自己使用的shell信息,當用戶登錄時,該文件僅僅執行一次。默認情況下,他設置一些環境變量,執行用戶的.bashrc文件。(如果~/目錄下沒有.bash_profile則新建立一個)

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

  4. ~/.pam_environment:用戶級的環境變量設置文件,沒有做測試,不知道管不管用。

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

環境變量文件的執行順序

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

在剛登錄Linux時,首先啟動 /etc/profile 文件,然后再啟動用戶目錄下的 ~/.bash_profile、 ~/.bash_login或 /.profile文件中的其中一個,用戶主目錄下文件的執行的順序為:/.bash_profile -> ~/.bash_login -> ~/.profile。

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

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

if [ -f ~/.bashrc ] ; then. ./bashrc
fi
~/.bashrc中,一般還會有以下代碼:if [ -f /etc/bashrc ] ; then. /etc/bashrc
fi

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

所以整體的執行順序為: /etc/profile -> (~/.bash_profile | ~/.bash_login | ~/.profile) -> ~/.bashrc -> /etc/bashrc -> ~/.bash_logout

各種環境變量設置文件順序的用處

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)有不同的值,那應該是以用戶環境為準了。

常用環境變量介紹

PATH

PATH是可執行文件的搜索路徑,是我們最常接觸到的,因為我們命令行中的每句能運行的命令,如lstopps等,都是系統通過PATH找到了這個命令執行文件的所在位置,再run這個命令(可執行文件)。

查看PATH環境變量,可以直接用echo $PATH,輸出的結果是以冒號分隔的;為了改善可讀性,我們可以將冒號替換為換行符:echo $PATH | sed "s/:/\n/g"。詳見Linux中的awk、sed、grep及正則表達式詳解中的例子。

LIBRARY_PATH和LD_LIBRARY_PATH

這兩個路徑可以放在一起討論,

  • LIBRARY_PATH是程序編譯期間查找動態鏈接庫時指定查找共享庫的路徑
  • LD_LIBRARY_PATH是程序加載運行期間查找動態鏈接庫時指定除了系統默認路徑之外的其他路徑

兩者的共同點是,庫是這兩個路徑和PATH路徑的區別,PATH是可執行文件。

兩者的差異點是使用時間不一樣。一個是編譯期,對應的是開發階段,如gcc編譯;一個是加載運行期,對應的是程序已交付的使用階段。

LD_PRELOAD

LD_PRELOAD是Linux系統的一個環境變量,它可以影響程序的運行時的鏈接(Runtime linker),它允許你定義在程序運行前優先加載的動態鏈接庫,一方面,我們可以以此功能來使用自己的或是更好的函數(比如,你可以使用Google開發的tcmalloc來提升效率),而另一方面,我們也可以向別人的程序注入程序,從而達到特定的目的。

PS1

PS1環境變量用于改變終端的提示符。比如:

export PS1="$ "

其他環境變量

注意以上也不是窮舉列出了環境變量,而是除了上面最常用的幾個之外,另外一些比較常用的。

  • $HOME 用戶家目錄
  • $LOGNAME 當前用戶的登錄名
  • $HOSTNAME 主機的名稱
  • $SHELL 用戶在使用的Shell解釋器名稱
  • $HISTSIZE 輸出的歷史命令記錄條數
  • $HISTFILESIZE 保存的歷史命令記錄條數
  • PS2 附屬提示符
  • $MAIL 郵件保存路徑
  • $LANG 系統語言、語系名稱
  • $RANDOM 生成一個隨機數字
  • $EDITOR 用戶默認的文本編輯器

查看和修改環境變量的命令

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

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

  2. export 設置一個新的環境變量 export HELLO=hello,在shell的命令行下直接使用[export 變量名=變量值] 定義變量,該變量只在當前的shell(BASH)或其子shell(BASH)下是有效的,shell關閉了,變量也就失效了,再打開新shell時就沒有這個變量,需要使用的話還需要重新定義。要想在永久地修改環境變量,需要像上面一樣在變量文件中export。

  3. env 顯示所有環境變量

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

  5. unset 清除環境變量 unset HELLO

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

更改方式

在當前shell中改變環境變量

直接在當前shell中執行:

export PS1="$ "

永久改變環境變量

將環境變量修改的命令添加到配置文件中,這樣每次新打開的shell也會時想要的環境變量配置了。

vim ~/.bashrc
export PS1="$ "    # 將這一句添加到最后

Ref:

https://www.imooc.com/article/43747

http://blog.itpub.net/69979681/viewspace-2743590/

https://blog.csdn.net/u010533843/article/details/54986646

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/532704.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/532704.shtml
英文地址,請注明出處:http://en.pswp.cn/news/532704.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

[分布式訓練] 單機多卡的正確打開方式:PyTorch

[分布式訓練] 單機多卡的正確打開方式:PyTorch 轉自:https://fyubang.com/2019/07/23/distributed-training3/ PyTorch的數據并行相對于TensorFlow而言,要簡單的多,主要分成兩個API: DataParallel(DP&am…

上學期C語言復習

C語言&#xff1a;面向過程例&#xff1a;完成兩個單元內容的交換 &#xff1a; #include<stdio.h> //定義一個完成兩個數據交換的函數 //void swap(int m,int n) void swap(int*m,int* n) { int temp;//臨時單元 temp*m; *m*n; *ntemp; } int main() {int a5,b10; print…

[分布式訓練] 單機多卡的正確打開方式:Horovod

[分布式訓練] 單機多卡的正確打開方式&#xff1a;Horovod 轉自&#xff1a;https://fyubang.com/2019/07/26/distributed-training4/ 講完了單機多卡的分布式訓練的理論、TensorFlow和PyTorch分別的實現后&#xff0c;今天瓦礫講一個強大的第三方插件&#xff1a;Horovod。 …

【c語言數據結構筆記】1.2 數據結構

1.2數據結構 數據元素并獨立 結構實體關系 形式定義&#xff08;D&#xff0c;S&#xff09; 其中D是數據元素的有限集&#xff0c;S是D上關系的有限集 eg&#xff1a;12位數&#xff1a;132423451233 分成三組四位數 次序關系<a1,a2><a2,a3> 遵守次序關系 eg&…

使用Apex進行混合精度訓練

使用Apex進行混合精度訓練 轉自&#xff1a;https://fyubang.com/2019/08/26/fp16/ 你想獲得雙倍訓練速度的快感嗎&#xff1f; 你想讓你的顯存空間瞬間翻倍嗎&#xff1f; 如果我告訴你只需要三行代碼即可實現&#xff0c;你信不&#xff1f; 在這篇博客里&#xff0c;瓦礫…

【數據結構1.3筆記】研究內容

1.3研究內容 數據結構&#xff08;D&#xff0c;S&#xff09; {邏輯結構&#xff1a; {物理結構&#xff08;存儲結構&#xff09; {數據的運算 1.邏輯結構 1 集合&#xff1a;集合&#xff0c;沒有邏輯關系 2 線性結構 “一對一” 3樹形結構 層次關系 4圖形結構 練習&…

Linux下的LD_PRELOAD環境變量與庫打樁

Linux下的LD_PRELOAD環境變量與庫打樁 LD_PRELOAD是Linux系統的一個環境變量&#xff0c;它可以影響程序的運行時的鏈接&#xff08;Runtime linker&#xff09;&#xff0c;它允許你定義在程序運行前優先加載的動態鏈接庫&#xff0c;一方面&#xff0c;我們可以以此功能來使…

2019年藍橋杯第一題

第一題 標題&#xff1a;組隊&#xff08;本題總分&#xff1a;5 分&#xff09; 作為籃球隊教練&#xff0c;你需要從以下名單中選出 1 號位至 5 號位各一名球員&#xff0c; 組成球隊的首發陣容。 每位球員擔任 1 號位至 5 號位時的評分如下表所示。請你計算首發陣容 1 號位…

深度學習編譯:MLIR初步

深度學習編譯MLIR初步 深度模型的推理引擎 目前深度模型的推理引擎按照實現方式大體分為兩類&#xff1a;解釋型推理引擎和編譯型推理引擎。 解釋型推理引擎 一般包含模型解析器&#xff0c;模型解釋器&#xff0c;模型優化器。 模型解析器負責讀取和解析模型文件&#xff…

深入淺出LLVM

深入淺出LLVM 轉自&#xff1a;https://www.jianshu.com/p/1367dad95445 什么是LLVM&#xff1f; LLVM項目是模塊化、可重用的編譯器以及工具鏈技術的集合。 美國計算機協會 (ACM) 將其2012 年軟件系統獎項頒給了LLVM&#xff0c;之前曾經獲得此獎項的軟件和技術包括:Java、A…

藍橋杯真題訓練 2019.2題

2019第二題 標題&#xff1a;年號字串&#xff08;本題總分&#xff1a;5 分&#xff09; 小明用字母 A 對應數字 1&#xff0c;B 對應 2&#xff0c;以此類推&#xff0c;用 Z 對應 26。對于 27 以上的數字&#xff0c;小明用兩位或更長位的字符串來對應&#xff0c;例如 AA…

一分鐘系列:什么是虛擬內存?

一分鐘系列&#xff1a;什么是虛擬內存&#xff1f; 轉自&#xff1a;https://mp.weixin.qq.com/s/opMgZrXV-lfgOWrNUMKweg 注&#xff1a;一分鐘系列的篇幅都不長&#xff0c;適合吃飯蹲坑、地鐵公交上食用&#xff5e; 內存對于用戶來說就是一個字節數組&#xff0c;我們可…

藍橋杯真題訓練 2019.3題

標題&#xff1a;數列求值 &#xff08;本題總分&#xff1a;10 分&#xff09;### 給定數列 1, 1, 1, 3, 5, 9, 17, …&#xff0c;從第 4 項開始&#xff0c;每項都是前 3 項的和。求 第 20190324 項的最后 4 位數字。 【答案提交】 這是一道結果填空的題&#xff0c;你只需…

11-Kafka

1 Kafka Kafka是一個分布式流式數據平臺&#xff0c;它具有三個關鍵特性 Message System: Pub-Sub消息系統Availability & Reliability&#xff1a;以容錯及持久化的方式存儲數據記錄流Scalable & Real time 1.1 Kafka架構體系 Kafka系統中存在5個關鍵組件 Producer…

虛擬內存精粹

虛擬內存精粹 標題&#xff1a;虛擬內存精粹 作者&#xff1a;潘建鋒 原文&#xff1a;HTTPS://strikefreedom.top/memory-management–virtual-memory 導言 虛擬內存是當今計算機系統中最重要的抽象概念之一&#xff0c;它的提出是為了更加有效地管理內存并且降低內存出錯的概…

藍橋杯真題訓練 2019.4題

標題&#xff1a; 數的分解&#xff08;本題總分&#xff1a;10 分&#xff09; 【問題描述】 把 2019 分解成 3 個各不相同的正整數之和&#xff0c;并且要求每個正整數都不包 含數字 2 和 4&#xff0c;一共有多少種不同的分解方法&#xff1f; 注意交換 3 個整數的順序被視…

深度學習自動編譯和優化技術調研

深度學習自動編譯和優化技術調研 轉自&#xff1a;https://moqi.com.cn/blog/deeplearning/ 作者&#xff1a;墨奇科技全棧開發 在墨奇科技&#xff0c;我們需要將一些包含深度神經網絡&#xff08;DNN&#xff09;的 AI 算法移植到邊緣端的設備&#xff0c; 這些設備往往使用 …

三元組數據處理系統

include<stdio.h> include<stdlib.h> define OK 1 define ERROR 0 define OVERFLOW -2 typedef int Status; typedef float ElemType; typedef ElemType *Triplet; // 聲明Triplet為ElemType指針類型 //三元組的初始化 Status initTriplet(Triplet &T, E…

Copy-On-Write COW機制

Copy-On-Write COW機制 轉自&#xff1a;https://zhuanlan.zhihu.com/p/48147304 作者&#xff1a;Java3y 前言 只有光頭才能變強 在讀《Redis設計與實現》關于哈希表擴容的時候&#xff0c;發現這么一段話&#xff1a; 執行BGSAVE命令或者BGREWRITEAOF命令的過程中&#xff0c…

實驗報告:抽象數據類型的表現和實現

實驗報告&#xff1a;抽象數據類型的表現和實現 實驗內容 基本要求&#xff1a; 設計實現抽象數據類型“三元組”&#xff0c;要求動態分配內存。每個三元組由任意三個實數的序列構成&#xff0c;基本操作包括&#xff1a;創建一個三元組&#xff0c;取三元組的任意一個分量&…