1. 程式人生 > >Shell:環境變數

Shell:環境變數

在大家初次接觸到Linux系統中,相信環境變數會讓你頭疼不已。習慣了在Windows設定PATH的你,被Linux上各種檔案可以設定環境變數頭疼不已!對於可以在當前使用者執行的命令,但是sudo就無法執行困惑不堪!下面,我們就係統的和大家講解下Linux的環境變數,讓大家豁然開朗;一、什麼是環境變數1.在Linux中,很多程式和指令碼都通過環境變數來獲取系統資訊、儲存臨時資料和配置資訊;2.bash shell使用環境變數來儲存有關shell會話和工作環境資訊;     允許你在記憶體中儲存資料,以便執行在shell的程式和指令碼訪問;     是儲存永久資料的一種簡單方法,用來識別使用者賬戶、系統、shell的特性,以及任何你需要儲存的資料;
3.在bash shell中,環境變數分為:     全域性變數:不僅對shell會話可見,對所有shell建立的子程序也可見; ;     區域性變數:只對建立它們的shell可見;二、全域性環境變數1.Linux在你開始bash會話之前就設定了一些全域性的環境變數;2.系統環境變數一律使用大寫字母以區別普通使用者的環境變數;3.printenv命令檢視全域性環境變數,大部分都是系統在使用者登入系統時設定的;
[email protected]:~$ printenv    //檢視所有全域性環境變數
XDG_SESSION_ID=1
TERM=vt100
SHELL=/bin/bash
SSH_CLIENT=192.168.1.102 50167 22
SSH_TTY=/dev/pts/27
USER=pengcx
MAIL=/var/mail/pengcx
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
QT_QPA_PLATFORMTHEME=appmenu-qt5
PWD=/home/pengcx
LANG=zh_CN.UTF-8
NODE_PATH=/usr/lib/nodejs:/usr/lib/node_modules:/usr/share/javascript
SHLVL=1
HOME=/home/pengcx
LANGUAGE=zh_CN:zh
LOGNAME=pengcx
SSH_CONNECTION=192.168.1.102 50167 192.168.1.104 22
XDG_RUNTIME_DIR=/run/user/1000
_=/usr/bin/printenv
4.echo命令顯示單個環境變數的值;
[email protected]:~$ echo $HOME    //顯示HOME單個全域性環境變數
/home/pengcx
5.在當前shell會話的子程序中也是可見的;
[email protected]:~$ bash
[email protected]:~$ echo $HOME    //在子程序中顯示HOME全域性環境變數
/home/pengcx
三、區域性環境變數1.Linux系統也預設定義了標準局部環境變數;2.set命令檢視某個特定程序的所有環境變數,這也包含全域性環境變數(通過printenv命令能看到的全域性環境變數都出現在了set命令的輸出中,但是set命令輸出中還有一些其它的環境變數,這就是區域性環境變數;
四、設定環境變數1.一旦啟動bash shell(或者執行一個shell指令碼),你就能建立這個shell程序可見的區域性環境變數;
[email protected]:~$ test=testing
[email protected]:~$ echo $test
testing
//如果變數賦一個含有空格的字串值,必須用單引號來界定字串的開始和末尾,沒有單引號的話,bash shell會以為下個字串是另一個命令
[email protected]:~$ test2=testing a long string
a:未找到命令
[email protected]:~$ test2='testing a long string'
[email protected]:~$ echo $test2
testing a long string
//如果建立了另外一個shell,它在子shell中就不可用了
[email protected]:~$ bash
[email protected]:~$ echo $test2

//如果你返回原shell區域性環境變數仍然存在
[email protected]:~$ exit
exit
[email protected]:~$ echo $test2
testing a long string
2.設定全域性環境變數,先建立一個區域性環境變數,然後再把它匯入到全域性變數中;
[email protected]:~$ bash
[email protected]:~$ echo $test

[email protected]:~$ exit
exit
[email protected]:~$ export test
[email protected]:~$ bash
[email protected]:~$ echo $test
testing
五、刪除環境變數1.使用unset命令來刪除環境變數;
[email protected]:~$ echo $test
testing
[email protected]:~$ unset test        //刪除test環境變數
[email protected]:~$ echo $test       //讀取test環境變數無效

[email protected]:~$
2.處理全域性環境變數時,如果你是在子程序中刪除了一個全域性環境變數,它只對子程序有效,該全域性環境變數在父程序中依然有效;
[email protected]:~$ test=testing    //先建立區域性變數
[email protected]:~$ export test       //匯入全域性變數
[email protected]:~$ echo $test       //在父程序中檢視test全域性變數
testing
[email protected]:~$ bash                //進入子程序
[email protected]:~$ echo $test       //在子程序中檢視test全域性變數
testing
[email protected]:~$ unset test        //在子程序中刪除test全域性環境變數
[email protected]:~$ echo $test       //在子程序中test全域性變數無效

[email protected]:~$ exit                  //回到父程序
exit
[email protected]:~$ echo $test       //在父程序中讀取test全域性變數有效
testing
七、設定PATH環境變數1.PATH環境變數定義了命令列輸入命令的搜尋路徑;
//通常應用會把可執行程式放到不在PATH環境變數中的目錄,那麼必須保證PATH環境變數包含了所有存放應用的目錄;
[email protected]:~$ mycmd.sh
mycmd.sh:未找到命令
[email protected]:~$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
//PATH的目錄之間是用冒號分隔的,只需引用原來的PATH值,然後在給字元新增新的目錄就行了;
[email protected]:~$ PATH=$PATH:/mycmd
[email protected]:~$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/mycmd
//現在可以在任何目錄下執行mycmd指令碼了
[email protected]:~$ mycmd.sh
running mycmd...
[email protected]:~$
2.通常使用單點符也加到PATH環境變數裡,單點符代表當前目錄;
 [email protected]:~$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/mycmd
[email protected]buntu:~$ PATH=$PATH:.
[email protected]:~$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/mycmd:.
八、定位系統環境變數1.在你登入Linux系統啟動一個bash shell時,預設情況下bash在幾個檔案中查詢命令,這幾個檔案成為啟動檔案;2.bash檢查的啟動檔案取決於你啟動bash shell的方式,啟動bash shell有3中方式:     登入時當做預設登入shell;     作為非登入shell的互動shell,在命令列中輸入bash;     作為執行指令碼的非互動shell,在shell指令碼中執行shell;3.當你登入Linux系統時,登陸了shell會從4個不同的啟動檔案裡讀取命令:     /etc/profile:bash shell的主啟動檔案,每個使用者登入都會執行這個啟動檔案;     $HOME/.bash_profile:使用者專用啟動檔案;     $HOME/.bash_login:使用者專用啟動檔案;     $HOME/.profile:使用者專用啟動檔案;4./etc/profile檔案
[email protected]:~$ cat /etc/profile
# /etc/profile: system-wide .profile file for the Bourne shell (sh(1))
# and Bourne compatible shells (bash(1), ksh(1), ash(1), ...).

if [ "$PS1" ]; then
  if [ "$BASH" ] && [ "$BASH" != "/bin/sh" ]; then
    # The file bash.bashrc already sets the default PS1.
    # PS1='\h:\w\$ '
    if [ -f /etc/bash.bashrc ]; then
      . /etc/bash.bashrc
    fi
  else
    if [ "`id -u`" -eq 0 ]; then
      PS1='# '
    else
      PS1='$ '
    fi
  fi
fi

# The default umask is now handled by pam_umask.
# See pam_umask(8) and /etc/login.defs.
//逐一訪問/etc/profile.d目錄的每個檔案,為Linux提供了一個集中存放使用者登入時要執行的應用專屬的啟動檔案
if [ -d /etc/profile.d ]; then
  for i in /etc/profile.d/*.sh; do
    if [ -r $i ]; then
      . $i
    fi
  done
  unset i
fi
[email protected]:/etc/profile.d$ ls -al
總用量 32
drwxr-xr-x   2 root root  4096  5月  4 16:40 .
drwxr-xr-x 147 root root 12288  5月  4 16:40 ..
-rw-r--r--   1 root root    40  4月 15  2014 appmenu-qt5.sh
-rw-r--r--   1 root root   663  4月  7  2014 bash_completion.sh
-rw-r--r--   1 root root    89  4月  1 14:19 nodejs.sh
-rw-r--r--   1 root root  1947 11月 22  2013 vte.sh
5.$HOME目錄下的啟動檔案     剩下的3個啟動檔案都起著同一個作用:提供一個使用者專屬的啟動檔案來定義使用者專有的環境變數;          $HOME/.bash_profile;          $HOME/.bash_login;          $HOME/.profile;     .bash_profile檔案;
[email protected]-Ubuntu:~$ cat .profile
     if [ -n "$BASH_VERSION" ]; then
         # include .bashrc if it exists
         //檢查HOME目錄中的是不是還有另外一個叫.bashrc啟動檔案
         if [ -f "$HOME/.bashrc" ]; then
             . "$HOME/.bashrc"
         fi
     fi

     # set PATH so it includes user's private bin if it exists
     //在HOME目錄底下提供了一個放置可執行檔案的通用位置
     if [ -d "$HOME/bin" ] ; then
         PATH="$HOME/bin:$PATH"
     fi
6.互動式shell     如果你在命令列提示符敲下bash命令,你啟動的shell稱作為互動式shell;     如果bash是作為互動式shell啟動的,它就不會去訪問/etc/profile檔案,而會去使用者的HOME目錄檢查.bashrc是否存在;     .bashrc檔案有兩個作用;          檢視/etc目錄下的公用bashrc檔案;          而是為使用者提供了一個定製自己的命令別名和私有指令碼函式的地方;

相關推薦

Shell環境變數

在大家初次接觸到Linux系統中,相信環境變數會讓你頭疼不已。習慣了在Windows設定PATH的你,被Linux上各種檔案可以設定環境變數頭疼不已!對於可以在當前使用者執行的命令,但是sudo就無法執

Linux Shell基礎 環境變數、位置引數變數、預定義變數

環境變數   環境變數和使用者自定義變數最主要的區別在於,環境變數是全域性變數,而使用者自定義變數是區域性變數。使用者自定義變數只在當前的 Shell 中生效,而環境變數會在當前 Shell 和這個 Shell 的所有子 Shell 中生效。如果把環境變數寫入相應的配

Linux Shell基礎 環境變數配置檔案

source命令:使環境變數配置檔案強制生效 source 命令會強制執行指令碼中的全部命令,而忽略指令碼檔案的許可權。該命令主要用於讓重新配置的環境變數配置檔案強制生效。source 命令格式如下: [[email protected] ~]# source 配置檔案 或 [[ema

Linux程式設計 11(shell全域性環境變數與局變環境變數)

一.概述   在linux中,很多程式和指令碼都通過環境變數來獲取系統資訊,儲存臨時資料,配置資訊。環境變數是指用來儲存有關shell會話和工作環境資訊,允許你在記憶體中儲存資料,以便程式或shell中執行的指令碼能夠輕鬆訪問到它們。也是儲存持久資料的一種簡便方法。在bash shell中,環境變數分為:全域

Oracle 環境變數相關總結,Toad關於OCI的配置,PLSQL等配置

環境變數快速示例 在環境變數中,有效的環境變數有如下 ORACLE_HOME ORACLE_SID SQLPATH TNS_ADMIN NLS_LANG 其中ORACLE_HOME環境變數允許指向多個instant-client ,需要注意的是,對於pls

PWN入門之三環境變數的獲取程式段的分析

如下圖,假設程式碼執行前的esp暫存器指向的地址是0xffffdfac,逐條分析右側的32位程式碼,並將分析結果按一定的規則記錄於如圖中左側所示的電子表格,其中第一列表記憶體地址,第二列表記憶體值,第三列表該地址編號被哪個暫存器儲存,第四列為備註,小括號內的數字為彙編程式碼與

awk字串操作(字串連結、傳入傳出shell變數) awk 字串連線操作(字串轉數字,數字轉字串) awk當中使用外部變數 awk中使用shell環境變數 awk如何向shell傳值

1.awk基礎 awk的環境變數及其意義   https://blog.csdn.net/snowpay/article/details/52451718 linux awk命令詳解 https://www.cnblogs.com/xudong-bupt/p/3721210.html 2.aw

Linux基礎學習之Shell基礎——環境變數配置檔案

1、什麼是環境變數呢? 可以在父shell和子shell中都能呼叫的就是環境變數,只能在本shell中使用的變數就是普通的變數。 2、什麼是環境變數配置檔案呢? linux 中所有需要永久生效的內容,都必須寫入配置檔案中;同樣,對於環境變數,想要在系統重啟 或者其他情況下,讓該環

linux shell “永久環境變數”、“臨時環境變數”和"普通變數"之完全解讀

        這個年代, 大家寫點書, 也無非就是為了搞點錢, 基本都是羅列一些知識點, 基本都是寫給已經會了的人看的。 真正用心寫書的人, 不多。 如果真正用心寫書, 且站在讀者的角度去寫, 那就少之又少了。         關於linux shell環境變數, 我看

Linux環境變數

# 環境變數 ## 變數 變數定義:declare tmp,declare是可選的。 變數賦值:tmp=1,=號左右不要有空格。 變數引用:echo $tmp,不要忘記了$號。 ## 環境變數 簡單理解了變數的概念,就很好解釋環境變量了,環境變數就是作用域比自定義變

【Linux學習筆記】27環境變數中的語系變數

語系就是用的是什麼人類語言,本節專門學習環境變數中的語系變數。 [1]locale確定系統當前語系 [[email protected] ~]# locale LANG=zh_CN.UTF-8 LC_CTYPE="zh_CN.UTF-8" LC

bash shell一些環境變數

BASH 擴充套件到用於呼叫bash例項的完整檔名。 BASHOPTS 啟用shlell選項的冒號分隔的列表。列表中的每個詞都是-s選項shopt內建命令的有效引數。出現在BASHOPTS的選項那些禁用了javascript報告上。如果這個變數在環境中當b

cmd編譯執行java無法載入主類(前提環境變數沒問題,主函式沒問題)

首先,以下為cmd編譯執行java的標準步驟 C:\Users\>javac Main.jav C:\Users\>java Main //沒有.class 出錯的話會打印出

JAVA基礎學習筆記(1)環境變數設定與Notepad++巨集設定

JAVA環境變數配置: 變數名:JAVA_HOME 變數值:(JAVA JDK安裝路徑) 變數名:CLASSPATH  變數值:.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar; 變數名:Path  變數值:%JAVA_H

Linux系統小技巧(4)環境變數JAVA_TOOL_OPTIONS簡介

有關此環境變數的官方文件在此,本不用再饒舌,但是似乎不少人不知道這個變數及其文件。為傳播計,還是記錄一下。 首先,這個變數名字裡雖然又“TOOL”字眼,但是,其角色卻是“JAVA_OPTIONS”。只不過因緣巧合,名不符實罷了。 平時見慣了有衝擊力的java命令列。比如,這樣的 但是,偶爾還是

[Shell]Bash變量環境變量的配置文件和登錄信息

搜索 tar 技術 shel tro 文件的 ash 決定 永久 只有把環境變量放入配置文件中,才能每次開機自動生效。source命令:讓配置文件直接生效,而不用註銷或重新登錄。   source 配置文件  或者  . 配置文件(等同於 source 配置文件)

配置maven環境變數cmd控制檯提示mvn不是內部或外部命令,也不是可執行的程式或批處理檔案

下載Maven http://maven.apache.org/download.cgi 下載 apache-maven-x.x.x-.bin.zip ,下載後到硬碟 配置maven環境變數cmd控制檯提示:mvn不是內部或外部命令,也不是可執行的程式或批處理檔案 首先maven環境變數:

Crontab內環境變數Shell環境變數的關係及解決問題的辦法

問題 有時需要用到Crontab的定時任務去執行指令碼,但是發現通過命令(./test.sh)執行Shell檔案的時候,可以獲取Linux的環境變數;可是通過Crontab做的定時任務,無法獲取。 問題剖析 crontab有一個壞毛病,就是它總是不會預設的從使用者profi

分享知識-快樂自己配置(各種)環境變數

1):配置JDK環境變數 小編使用的jdk-8u91-windows-i586.exe: JDK地址:https://pan.baidu.com/s/1xhTW1eAKpCZzAQoYUC0sxA  步驟: 1):找到安裝目錄:   2):編輯環境變數設定:計算機右鍵----屬性----

Mysql設定環境變數

問題:mysql使用系統計劃任務備份,點選bat檔案,生成檔案,沒有資料 原因:mysqldump 為MySQL提供的備份命令,該命令所在目錄為MySQL安裝目錄下的bin資料夾中,此處直接使用該命令的前提是該命令所在bin資料夾已被設定為系統環境變數 步驟 我的電腦右鍵