一直以來,配置環境變量的時候都是管中窺豹,對於環境變量的配置似懂非懂。 如今就來認真補一補這方面的不足。java
主要內容包括:node
先來思考這些問題:python
專項學習環境變量以前的理解:霧裏看花 java,node,go,python這些命令在SDK安裝過程當中就會自動安裝。 mysql,mongoDB bash環境變量須要手動添加到環境當中。 flutter shell 環境變量須要手動配置。 bash variable與shell variable最直觀的區別在於:bash variable在bash terminal中訪問;shell variable在shell文件中保存。mysql
專項學習環境變量以後的理解:洞若觀火 發現環境變量居然包括以上如此多內容,最初的問題也能夠一一找到答案。linux
接下來就來看看關於環境變量,到底有哪些須要掌握的知識點。git
這是一個指向用戶的home目錄的bash var。 格式爲/Users/<username>
或/var/root
(macOS)。linux系統上爲/home/<username>
。es6
// frank用戶
echo $HOME // /Users/frank
// root用戶
echo $HOME // /var/root
複製代碼
引伸問題:github
在bash中,只有加上$之後,系統纔會知道咱們要輸出的是變量,不然會當作輸出一個普通字符串處理。sql
取決於系統上有幾個用戶,有個用戶就有幾個HOME變量。 通常會有一個root用戶和至少一個普通用戶。docker
在~/.bash_profile中重寫。(須要手動source纔有效,當前session有效) 在bash session terminal中export HOME=/Users/frank/foo。(當前session有效) 關閉再打開或者新開一個tab,$HOME都會變爲最原始的值。 不建議重寫。具體緣由看緣由6。
能夠。$HOME/tools // /Users/frank/tools
沒有。空格在shell中有特殊含義。
/etc/profile //# System-wide .profile for sh(1)
由於大量的程序依賴HOME這個環境變量,因此覆蓋系統默認變量是很危險的。 因此通常僅在當前session有效,若想永久覆蓋,可參考PATH的加粗部分。
這個系統變量,會列出可執行程序的目錄。 java,node,go,python這些命令在SDK安裝過程當中就會自動安裝的緣由就是這個,sdk會自動添加路徑到PATH變量中。
mkdir $HOME/bin
新建本身的bin目錄,並經過PATH=$PATH:$HOME/bin
將自定義的bin目錄加入到PATH變量。要寫在.bashrc(linux),.bash_profile(macOS)中,用source .bashrc可讓文件當即生效。(親測無卵用,.bash_profile僅在當前session生效,不過路徑在.bash_profile中寫是對的)source ~/.bash_profile
// bin目錄間用冒號分隔
echo $PATH // /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
複製代碼
➜ ~ foo=123
➜ ~ echo $foo
123
➜ ~ bash
bash-3.2$ echo $foo
複製代碼
這個例子中的bash命令,會開啓一個daughter process,在mother process中設定的自定義變量是沒法訪問的。
爲何/usr/bin中會有java全家桶的bin呢?
難道java全家桶的命令不是存放在/Library/Java/JavaVirtualMachines/jdk-11.0.3.jdk/Contents/Home/bin嗎?爲何/usr/bin中也有。
經過ls -l /usr/bin | grep java
能夠查實緣由。
lrwxr-xr-x 1 root wheel 74 5 4 17:12 java -> /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands/java
lrwxr-xr-x 1 root wheel 75 5 4 17:12 javac -> /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands/javac
lrwxr-xr-x 1 root wheel 77 5 4 17:12 javadoc -> /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands/javadoc
lrwxr-xr-x 1 root wheel 75 5 4 17:12 javah -> /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands/javah
lrwxr-xr-x 1 root wheel 75 5 4 17:12 javap -> /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands/javap
lrwxr-xr-x 1 root wheel 82 5 4 17:12 javapackager -> /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands/javapackager
lrwxr-xr-x 1 root wheel 76 5 4 17:12 javaws -> /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands/javaws
複製代碼
soft link。 /usr/bin中的java全家桶命令只是/Library/Java/JavaVirtualMachines/jdk-11.0.3.jdk/Contents/Home/bin部分bin文件的soft link。
若是不懂soft link,能夠移步[譯]Soft and Hard links in Unxi/Linux
new_variable="Hello"
echo $new_variable
如何在bash daughter process中也能訪問到自定義變量呢,也就是如何在進程間共享自定義變量呢?
➜ ~ export bar=456
➜ ~ bash
bash-3.2$ echo $bar
456
複製代碼
從這個例子中能夠看到,export就是幹這個事情的。(es6中的export和這個也很相似,只有export的內容,其餘模塊才能得到數據。) 注意:在daughter process修改繼承來的變量值,mother process不會被修改。(這個和編程語言中的繼承很像。)
export -p
...
export USER=frank
export OLDPWD=/
export ZSH=/Users/frank/.oh-my-zsh
export bar=456
...
複製代碼
OLDPWD這個變量指的就是最近一次訪問的目錄,經過cd -
訪問到的其實就是這個目錄。 一樣,經過env
也能夠直接得到全部的環境變量列表,不一樣的地方在於不帶export而且是環境變量的最終結果,export -p
會顯示變量的詳細配置(由於它有可能依賴其餘環境變量)。