一、問題的引出
項目中腳本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 9月 22日 2010年 /sbin/sh
> ls -l /usr/bin/bash
-r-xr-xr-x 1 root bin 795204 12月 24日 21: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解釋運行腳本!