注意:解釋器需在開頭第一行指定
#!
注釋的是加載器(解釋器)的路徑什燕, 比如: #!/bin/bash
就是說把腳本中的代碼指令都傳遞給/bin/bash
:bin目錄中的bash解釋器來執(zhí)行。
mac:~ user01$ cd /bin
mac:~ user01$ ls
[ df launchctl pwd test
bash domainname link rm unlink
cat echo ln rmdir wait4path
chmod ed ls sh zsh
cp expr mkdir sleep
csh hostname mv stty
date kill pax sync
dd ksh ps tcsh
除了使用 #!/bin/bash
外级解,大部分的腳本中都習(xí)慣使用#!/usr/bin/env
來指定路徑闰挡。
那么鹃觉,env到底有什么用呢酷鸦?
先結(jié)合實(shí)際使用中遇到的問題看看:
腳本解釋器在linux中可能被安裝于不同的目錄荆责,或者同一個(gè)軟件(比如Python滥比、perl)安裝有多個(gè)版本:
mac:~ user01$ which python
/usr/bin/python
mac:~ user01$ which python3
/usr/local/bin/python3
mac:~ user01$ which -a perl
/root/perl5/perlbrew/perls/perl-5.26.1/bin/perl
/usr/bin/perl
- python2版本和python3不僅目錄不同,還因?yàn)椴患嫒莸膯栴}使用的解釋器名稱也不相同做院,python表示版本2盲泛,python3表示版本3以上。
到底執(zhí)行哪一個(gè)解釋器键耕,取決于PATH
環(huán)境變量內(nèi)路徑的排列順序:
mac:~ user01$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
在PATH
環(huán)境中寺滚,如果要使用perl
顯然優(yōu)先執(zhí)行的是/root/perl5/...
目錄下的perl-5.26.1版本。但是如果想要執(zhí)行一個(gè)程序在perl-5.26.1以下版本運(yùn)行屈雄,就可以使用:
mac:~ user01$ env PATH=/usr/bin perl xxx.pl
指定解釋器路徑的方式來執(zhí)行perl腳本村视。
綜合上述說明:
env是一個(gè)指令,可以指定解釋器的具體路徑酒奶,如果不指定具體路徑蚁孔,那么將根據(jù)PATH
環(huán)境變量中的目錄順序去查找奶赔。同時(shí),env還規(guī)定一些系統(tǒng)環(huán)境變量杠氢。
mac:~ user01$ env
TERM_PROGRAM=Apple_Terminal
SHELL=/bin/bash
TERM=xterm-256color
TMPDIR=/var/folders/zd/cw9zr66d65xcx_ylk5bkm1240000gn/T/
TERM_PROGRAM_VERSION=404.1
...... 省略很多 ......
實(shí)際開發(fā)中如果直接將解釋器路徑寫死在腳本里#!/usr/bin/perl
站刑,可能在某些系統(tǒng)就會(huì)出現(xiàn)找不到解釋器而造成的兼容性問題。這時(shí)就可以通過env指令來解決這個(gè)問題:
示例: #!/usr/bin/env -S-P/usr/local/bin:/usr/bin:${PATH} perl
這種寫法可以讓你的腳本在不同的系統(tǒng)上都能適用鼻百。 env會(huì)在/usr/local/bin
绞旅、/usr/bin
、${PATH}
這2+N個(gè)目錄(${PATH}表示PATH環(huán)境變量中定義的目錄)中尋找perl來執(zhí)行的温艇。
-S-P參數(shù)解釋:
-P參數(shù):指定一些目錄去尋找perl這個(gè)程序因悲,
#!/usr/bin/env -P/usr/local/bin:/usr/bin perl
的作用就是指定在/usr/local/bin和/usr/bin目錄下尋找perl。
為了讓程序更加的有可擴(kuò)展性中贝,可以寫成
#!/usr/bin/env -S-P/usr/local/bin:/usr/bin:${PATH} perl
囤捻,那么它除了在這兩個(gè)目錄尋找之外,還會(huì)在PATH變量中定義的目錄中尋找邻寿。