在bash shell中,環境變數分為: >全局變數 >局部變數 全局變數,不僅對shell可見,對其子進程也可見 查看預設的全局環境變數: 這兩個命令都可以列印全局環境變數 HOME是一個全局環境變數,保存用戶的家目錄 上面說了,全局環境變數對子shell也有用,我們就開啟一個子進程,來驗證一下: ...
在bash shell中,環境變數分為:
>全局變數
>局部變數
全局變數,不僅對shell可見,對其子進程也可見
查看預設的全局環境變數:
ghostwu@dev:~$ printenv
ghostwu@dev:~$ env
這兩個命令都可以列印全局環境變數
ghostwu@dev:~$ printenv | grep HOME HOME=/home/ghostwu ghostwu@dev:~$
HOME是一個全局環境變數,保存用戶的家目錄
ghostwu@dev:~$ echo $HOME /home/ghostwu
上面說了,全局環境變數對子shell也有用,我們就開啟一個子進程,來驗證一下:
ghostwu@dev:~$ bash ghostwu@dev:~$ ps -f UID PID PPID C STIME TTY TIME CMD ghostwu 4647 4642 1 22:25 pts/11 00:00:00 bash ghostwu 4659 4647 3 22:25 pts/11 00:00:00 bash ghostwu 4670 4659 0 22:25 pts/11 00:00:00 ps -f ghostwu@dev:~$ echo $HOME /home/ghostwu ghostwu@dev:~$ exit exit ghostwu@dev:~$ echo $HOME /home/ghostwu
由此可見,在當前的shell 以及子shell中 都能訪問到全局環境變數
局部環境變數:只能在定義他們他們的進程中可見
設置局部變數,跟php的語法差不多,只不過不需要美元符號,讀取局部變數需要用$符號
ghostwu@dev:~$ echo $my_var
讀取一個沒有定義的局部環境變數,值為空
ghostwu@dev:~$ echo $my_var ghostwu@dev:~$ my_var=ghostwu ghostwu@dev:~$ echo $my_var ghostwu
定義局部變數的=號左右不要用空格,否則會被當做命令執行
ghostwu@dev:~$ myvar = 'hello' myvar: command not found
在子shell中,是不能訪問到父shell(進程)定義的局部變數.
ghostwu@dev:~$ echo $my_var ghostwu ghostwu@dev:~$ ps -f UID PID PPID C STIME TTY TIME CMD ghostwu 4647 4642 0 22:25 pts/11 00:00:00 bash ghostwu 5372 4647 0 22:31 pts/11 00:00:00 ps -f ghostwu@dev:~$ bash ghostwu@dev:~$ echo $my_var ghostwu@dev:~$ exit exit ghostwu@dev:~$ echo $my_var ghostwu
如果需要在子shell中訪問到父shell中定義的局部變數,我們可以把局部變數導入到全局變數中,怎麼導入?用export 變數名稱 即可,導入的時候,變數名稱前面
不要用$符號
ghostwu@dev:~$ printenv | grep my_var ghostwu@dev:~$ export my_var ghostwu@dev:~$ !p printenv | grep my_var my_var=ghostwu ghostwu@dev:~$ echo $my_var ghostwu ghostwu@dev:~$ bash ghostwu@dev:~$ ps -f UID PID PPID C STIME TTY TIME CMD ghostwu 5790 5785 0 22:33 pts/11 00:00:00 bash ghostwu 5835 5790 6 22:34 pts/11 00:00:00 bash ghostwu 5846 5835 0 22:34 pts/11 00:00:00 ps -f ghostwu@dev:~$ echo $my_var ghostwu ghostwu@dev:~$ exit exit ghostwu@dev:~$ echo $my_var ghostwu ghostwu@dev:~$ printenv | grep my_var my_var=ghostwu
刪除環境變數,用unset。
>在父shell中,刪除一個導入到全局變數的 環境變數,之後就訪問不到這個變數了
ghostwu@dev:~$ printenv | grep my_var my_var=ghostwu ghostwu@dev:~$ echo $my_var ghostwu ghostwu@dev:~$ unset my_var ghostwu@dev:~$ echo $my_var ghostwu@dev:~$ bash ghostwu@dev:~$ echo $my_var ghostwu@dev:~$ exit exit
>如果在子shell中,導入一個全局變數,然後刪除,那麼子shell中訪問不到,但是在父shell中,還可以訪問到
ghostwu@dev:~$ echo $my_var ghostwu@dev:~$ my_var="ghostwu" ghostwu@dev:~$ export my_var ghostwu@dev:~$ printenv | grep my_var my_var=ghostwu ghostwu@dev:~$ bash ghostwu@dev:~$ echo $my_var ghostwu ghostwu@dev:~$ unset my_var ghostwu@dev:~$ echo $my_var ghostwu@dev:~$ exit exit ghostwu@dev:~$ echo $my_var ghostwu
PATH環境變數,定義了一堆路徑,這些路徑的作用是,當命令行輸入一個命令的時候,在去PATH變數中定義的路徑中去尋找。所以,如果想讓一個自定義的可執行
程式能夠在任意目錄下執行,就需要把這個可執行的程式所在的目錄設置到PATH環境變數。怎麼設置呢? 在PATH變數中,路徑用:號分隔。
假如,我在root的家目錄下麵創建了一個bin目錄,用來放一個shell腳本,名字為ghost
ghostwu@dev:~/bin$ pwd /home/ghostwu/bin ghostwu@dev:~/bin$ ls -l total 4 -rwxrwxr-x 1 ghostwu ghostwu 20 5月 22 22:44 ghost ghostwu@dev:~/bin$ cat ghost #!/bin/bash ls -l / ghostwu@dev:~/bin$ ./ghost total 105 drwxr-xr-x 2 root root 4096 5月 17 23:16 bin drwxr-xr-x 4 root root 1024 2月 10 16:23 boot drwxr-xr-x 2 root root 4096 2月 10 16:15 cdrom drwxr-xr-x 20 root root 4400 5月 22 22:16 dev drwxr-xr-x 139 root root 12288 5月 18 05:11 etc drwxr-xr-x 4 root root 4096 2月 10 16:16 home lrwxrwxrwx 1 root root 33 2月 10 16:17 initrd.img -> boot/initrd.img-4.10.0-28-generic drwxr-xr-x 22 root root 4096 5月 17 23:52 lib drwxr-xr-x 2 root root 4096 5月 17 23:39 lib64 drwx------ 2 root root 16384 2月 10 16:12 lost+found drwxr-xr-x 3 root root 4096 2月 9 16:34 media drwxr-xr-x 3 root root 4096 4月 7 11:10 mnt drwxr-xr-x 4 root root 4096 5月 17 23:22 opt drwxr-xr-x 2 root root 4096 5月 18 05:12 patch dr-xr-xr-x 245 root root 0 5月 22 22:16 proc drwx------ 9 root root 4096 5月 20 06:57 root drwxr-xr-x 29 root root 900 5月 22 22:21 run drwxr-xr-x 2 root root 12288 2月 10 16:24 sbin drwxr-xr-x 2 root root 4096 4月 29 2017 snap drwxr-xr-x 2 root root 4096 8月 1 2017 srv dr-xr-xr-x 13 root root 0 5月 22 22:16 sys drwxrwxrwt 14 root root 4096 5月 22 22:44 tmp drwxr-xr-x 11 root root 4096 8月 1 2017 usr drwxr-xr-x 15 root root 4096 5月 17 23:28 var lrwxrwxrwx 1 root root 30 2月 10 16:17 vmlinuz -> boot/vmlinuz-4.10.0-28-generic drwxr-xr-x 6 root root 4096 5月 17 23:19 www
由於我的PATH變數,已經包含了/home/ghostwu/bin這個路徑,所以在任意的目錄下,都會搜素這個目錄,就會執行ghost
ghostwu@dev:~$ cd /etc ghostwu@dev:/etc$ ghost total 105 drwxr-xr-x 2 root root 4096 5月 17 23:16 bin drwxr-xr-x 4 root root 1024 2月 10 16:23 boot drwxr-xr-x 2 root root 4096 2月 10 16:15 cdrom drwxr-xr-x 20 root root 4400 5月 22 22:16 dev drwxr-xr-x 139 root root 12288 5月 18 05:11 etc drwxr-xr-x 4 root root 4096 2月 10 16:16 home lrwxrwxrwx 1 root root 33 2月 10 16:17 initrd.img -> boot/initrd.img-4.10.0-28-generic drwxr-xr-x 22 root root 4096 5月 17 23:52 lib drwxr-xr-x 2 root root 4096 5月 17 23:39 lib64 drwx------ 2 root root 16384 2月 10 16:12 lost+found drwxr-xr-x 3 root root 4096 2月 9 16:34 media drwxr-xr-x 3 root root 4096 4月 7 11:10 mnt drwxr-xr-x 4 root root 4096 5月 17 23:22 opt drwxr-xr-x 2 root root 4096 5月 18 05:12 patch dr-xr-xr-x 245 root root 0 5月 22 22:16 proc drwx------ 9 root root 4096 5月 20 06:57 root drwxr-xr-x 29 root root 900 5月 22 22:21 run drwxr-xr-x 2 root root 12288 2月 10 16:24 sbin drwxr-xr-x 2 root root 4096 4月 29 2017 snap drwxr-xr-x 2 root root 4096 8月 1 2017 srv dr-xr-xr-x 13 root root 0 5月 22 22:45 sys drwxrwxrwt 14 root root 4096 5月 22 22:44 tmp drwxr-xr-x 11 root root 4096 8月 1 2017 usr drwxr-xr-x 15 root root 4096 5月 17 23:28 var lrwxrwxrwx 1 root root 30 2月 10 16:17 vmlinuz -> boot/vmlinuz-4.10.0-28-generic drwxr-xr-x 6 root root 4096 5月 17 23:19 www
在ubuntu16.04下麵,這個路徑設置是在.profile這個文件中的,而用戶登錄系統時,會執行這個.profile,所以PATH中的設置就會生效,接下來把他刪除.
ghostwu@dev:~$ tail -1 .profile PATH="$HOME/bin:$HOME/.local/bin:$PATH"
刪除之後,你會發現,他依然存在,但是文件中確實是刪除了,這個時候,我們要重啟系統.
ghostwu@dev:~$ vim .profile ghostwu@dev:~$ tail -2 .profile #PATH="$HOME/bin:$HOME/.local/bin:$PATH" PATH="$HOME/.local/bin:$PATH" ghostwu@dev:~$ echo $PATH /home/ghostwu/bin:/home/ghostwu/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
註銷系統也可以,我們刪除的路徑,已經生效了
ghostwu@dev:~$ echo $PATH /home/ghostwu/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin ghostwu@dev:~$ cd /etc ghostwu@dev:/etc$ ghost ghostwu@dev:/etc$
我們可以臨時把路徑設置回去,在bin目錄下創建一個腳本ghost2.,沒有設置路徑之前,ghost2是找不到的
ghostwu@dev:~$ echo $PATH /home/ghostwu/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin ghostwu@dev:~$ cat ~/bin/ghost2 #!/bin/bash ls -l /etc ghostwu@dev:~$ ghost2 ghost2: command not found
現在,就生效了,但是這個生效,在當前shell進程退出,或者另外的shell裡面訪問,是訪問不到的,如果我們想永久讓設置的環境保存下來,應該把他寫在文件中,
一般寫在下麵4個文件中
/etc/profile: 這個是所有登錄的用戶都會載入的文件
$HOME/.bash_profile
$HOME/.bash_login
$HOME/.profile
後面3個文件是用戶專用。我們之前的變數就是設置在.profile中。其實,還有一個文件,也可以設置:.bashrc。為甚呢?因為.profile會判斷是否存在.bashrc。從而
載入.bashrc。所以在.bashrc中設置的環境變數,也會永久保存在當前用戶環境下.
ghostwu@dev:~$ echo $PATH /home/ghostwu/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin ghostwu@dev:~$ cat ~/bin/ghost2 #!/bin/bash ls -l /etc ghostwu@dev:~$ ghost2 ghost2: command not found ghostwu@dev:~$ ghostwu@dev:~$ PATH=$PATH:$HOME/bin ghostwu@dev:~$ echo $PATH /home/ghostwu/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/home/ghostwu/bin ghostwu@dev:~$ ghost2 total 1252 drwxr-xr-x 3 root root 4096 8月 1 2017 acpi ....