solaris移植到linux的大坑:bash和sh中環境變量繼承的差異

一、問題的引出

項目中腳本A 、B,A調用B,
其中A中所有命令均使用絕對路徑,B中直接使用
在solaris上工作正常,移植到linux中報錯:

/syscom/lm/linux//backupgen: line 60: mkdir: command not found
/syscom/lm/linux//backupgen: line 61: cd: /syscom//tmp/syscom_dir: No such file or directory
/syscom/lm/linux//backupgen: line 62: mkdir: command not found

沒有找到cd、mkidr等命令,很明顯是PATH變量設置錯誤了。
很快定位到問題點,在A中設置了非法的PATH值:

PATH=/syscom/tmp

那爲何在solaris上就沒有報錯了?

二、bash中環境變量的繼承關係

該腳本使用的解釋器是/bin/sh,在一般的理解中,bash和sh完全一樣。

[jud@syscom]$ls -l /bin/sh
lrwxrwxrwx. 1 root root 4 Mar 18  2014 /bin/sh -> bash

在linux中sh是bash的鏈接,已經沒有sh了。

測試bash中變量繼承關係:

[jud@~]$TEST=a                    #設置自定義變量TEST值爲a
[jud@~]$echo $TEST
a
[jud@~]$bash                      #進入子bash
[jud@~]$echo $TEST               #打印TEST變量,值爲空

[jud@~]$ echo $PATH               #打印PATH變量的值
/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/syscom/bin:/syscom/lm/linux:.
[jud@~]$ PATH=/tmp                #設定PATH的值
[jud@~]$ echo $PATH
/tmp
[jud@~]$ bash                 #進入子bash,無法使用bash命令
-bash: bash: command not found
[jud@~]$ /bin/bash                #必須用絕對路徑纔可以
bash: id: command not found
bash: id: command not found
[jud@~]$ echo $PATH               #子bash繼承了父bash的環境變量
/tmp

如果通過export命令將自定義變量 TEST變更爲 環境變量

[syscom@sysbase0-0 ~]$ export TEST=a
[syscom@sysbase0-0 ~]$ bash
[syscom@sysbase0-0 ~]$ echo $TEST
a

從以上的舉例中可以看出來,bash中自定義變量是不能繼承的,環境變量是繼承的。

sh中環境變量繼承關係

在古老的solaris上仍然使用着sh

> ls -l /sbin/sh
-r-xr-xr-x   1 root     root       95492  9222010年 /sbin/sh
> ls -l /usr/bin/bash
-r-xr-xr-x   1 root     bin       795204 122421:58 /usr/bin/bash

可見在solaris上bash與sh是兩個不同的shell!
測試sh中的變量繼承關係:

> sh
$ TEST=a                   #設置自定義變量TEST值爲a
$ echo $TEST
a
$ sh                       #進入子sh
$ echo $TEST               #打印TEST變量,值爲空

$ echo $PATH               #打印PATH變量的值
/usr/local/PGRUV05L23R1000_sol:.:/export/home/fnstli:/export/home/fnstli/bin:/usr/sbin:/usr/bin:/opt/SUNWspro/bin:/usr/ucb:/usr/etc:/usr/local/bin:/usr/ccs/bin:/usr/include:/etc/opt/FSUNiconv/bin:/usr/openwin/bin:/usr/X/bin:/usr/bin/X11:/usr/xwin/bin:/syscom-E11/lm/solaris:/syscom/tool:/syscom-E11/bin:/usr/sfw/bin:/opt/netbeans-5.5.1/bin:/usr/jdk/jdk1.5.0_16/bin:/usr/sfw/bin
$ PATH=/tmp                    #設定PATH的值
$ echo $PATH
/tmp
$ /sbin/sh                 #進入子sh
$ echo $PATH              #子sh中的$PATH沒有繼承父sh的值!
/usr/local/PGRUV05L23R1000_sol:.:/export/home/fnstli:/export/home/fnstli/bin:/usr/sbin:/usr/bin:/opt/SUNWspro/bin:/usr/ucb:/usr/etc:/usr/local/bin:/usr/ccs/bin:/usr/include:/etc/opt/FSUNiconv/bin:/usr/openwin/bin:/usr/X/bin:/usr/bin/X11:/usr/xwin/bin:/syscom-E11/lm/solaris:/syscom/tool:/syscom-E11/bin:/usr/sfw/bin:/opt/netbeans-5.5.1/bin:/usr/jdk/jdk1.5.0_16/bin:/usr/sfw/bin

從以上的舉例中可以看出來,sh中自定義變量是不能繼承的,環境變量同樣不能被繼承!

總結

環境變量在sh和bash的繼承規則並不相同。在solaris的腳本向linux平臺移植時,需要特別注意solaris大多使用sh解釋運行腳本!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章