學習linux commands:export
介紹
export命令是bash這個shell裡的內建命令之一,這意味著它是你的shell的一部分,export命令相當簡單,因為它有著簡單直接的語法和僅僅三個引數。 大致上,export命令標誌著在一個新的forked子程序匯出一個環境變數,並且因此允許一個子程序繼承所有標記的變數。如果你不明白這是什麼意思,這個文章會更詳細地解釋這個過程。
常用引數
-p
列出所有當前shell裡export出的變數的名稱-n
從export列表中移除某個變數-f
這些變數(names)將是作為函式被export(匯出)
基本的export
考慮一下這個例子:
$ a=linuxcareer.com
$ echo $a
linuxcareer.com //這是有輸出哦
$ bash
$ echo $a
//實際上沒有輸出哦
$
講解:
第一行:一個叫做“a”的變數,含有字元:linuxcareer.com被創建出來
第二行:使用echo命令列印變數a的內容
第三行: 建立新的子bash shell
第四行: 變數a沒有任何的值定義
從上面這個例子裡我們可以看到,任何從父程序裡fork的子程序預設並沒有繼承父程序的變數們。這就是為何我們需要export命令。看一下下面這個針對上面例子的改進版本吧:
$ a=linuxcareer.com
$ echo $a
linuxcareer.com
$ export a
$ bash
$ echo $a
linuxcareer.com
$
在第三行我們使用了export命令來讓a這個變數在新的子程序被建立時被匯出。結果就是,a變數是一個仍然保持“linuxcareer.com”字串的變數。
值得注意的是:為了在新的程序中(bash)仍然保留a這個變數,這個程序(bash)一定是fork的是a被建立的程序。
關於父子程序的關係在下面有解釋:
子程序vs父程序
在這個部分我們簡單地介紹父子程序之間的關係。任何一個程序都可以同時作為父程序和子程序。 唯一的一個例外就是init這個程序,這個程序一直會有一個1的PID(progress ID)。因此,init
$ps -p 1
PID TTY TIME CMD
1 ? 00:00:02 init
所有程序正常情況下都有一個父程序,在它被建立的地方,它因此會被當作一個父程序的孩子。例如:
$ echo $$
27861
$ bash
$ echo $$
28034
$ ps --ppid 27861
PID TTY TIME CMD
28034 pts/3 00:00:00 bash
第一行: 列印當前shell的pid 即 27861
第二行: 建立一個子程序,是從pid為27861這個程序建立
第三行: 列印當前shell 的pid 即 28034
第四行:使用ps命令列印pid是27861的子程序的pid (所以有28034在最後一行看到)
當建立一個新的子程序,export命令是用來保證所有父程序裡的變數都能在子程序裡可用。
使用export命令
我們已經學習了一些export的基本命令,現在探索一些細節把。當你不帶任何引數來使用export命令時,它只會簡單地輸出所有暴露給子程序的變數。這和你使用-p引數是一樣的:
$ export
declare -x COLORFGBG="15;0"
declare -x DEFAULTS_PATH="/usr/share/gconf/cinnamon.default.path"
declare -x DESKTOP_SESSION="cinnamon"
declare -x DISPLAY=":0".....
正如之前所展示的,要export一個變數我們只需使用那個變數名作為引數,作為export命令的引數。
$ MYVAR=10
$ export | grep MYVAR
$ export MYVAR
$ export | grep MYVAR
declare -x MYVAR="10"
如你所見,一旦MYVAR這個變數被export出去,它就會在被export過的變數列表中出現,另外,上面這個例子也能直接使用export命令來變得短一些。
$export MYVAR=10
$export | grep MYVAR
declare -x MYVAR="10"
最常用的export的可能就是用來定義PATH,這是一個shell變數
$export PATH=$PATH:/usr/local/bin
在上面這個例子中,我們把/usr/local/bin包括到了當前的PATH定義中。
從export列表中移除變數(names)
接下來這個例子,我們有MYVAR定義在export列表
$export |grep MYVAR
declare -x MYVAR="10"
移除變數,從export 列表的話,我們應該使用 -n引數。
$ export | grep MYVAR
declare -x MYVAR="10"
$ export -n MYVAR
$ export | grep MYVAR
$