1. 程式人生 > >學習linux commands:export

學習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

程序是所有執行在當前你的linux系統上的程序的老爹。

$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
$