env命令時gnu的coreutils包內的一個軟件,它的功能是:在一個修改后的環境里執行命令。
通俗的講:一個linux軟件可能被安裝在好幾個地方,舉個例子:在最新的centos中perl的版本為5.16,而我在home目錄下安裝了最新的5.26.1版本,這樣在同一個系統內,有2個perl的執行程序:
[root@noi ~]# man env [root@noi ~]# which -a perl /root/perl5/perlbrew/perls/perl-5.26.1/bin/perl /usr/bin/perl
到底執行哪一個,取決於PATH環境變量內路徑的排列順序
[root@noi ~]# echo $PATH /root/perl5/perlbrew/bin:/root/perl5/perlbrew/perls/perl-5.26.1/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
在被環境中,顯然執行的是home目錄下的5.26版本。但是這個時候,我想執行一個程序在5.16版本下,我可以使用:
[root@noi ~]# /usr/bin/perl --version This is perl 5, version 16, subversion 3 (v5.16.3) built for x86_64-linux-thread-multi (with 33 registered patches, see perl -V for more detail)
同時,我也可以利用env命令,來達到相同的目的:
[root@noi ~]# env PATH=/usr/bin perl --version This is perl 5, version 16, subversion 3 (v5.16.3) built for x86_64-linux-thread-multi (with 33 registered patches, see perl -V for more detail)
注意:這里PATH變量被我修改為 /usr/bin ,這就是man手冊說的,env可以在一個修改了的環境下,執行命令的含義。看下面,沒有修改PATH時,執行的情況:
[root@noi ~]# env perl --version This is perl 5, version 26, subversion 1 (v5.26.1) built for x86_64-linux (with 1 registered patch, see perl -V for more detail)
看到沒,執行的是home目錄版本,也就是依據上面PATH原值,來執行的。
依據這個特性,有時候我們在寫腳本,比如perl腳本的時候,如果想運行當前perl環境下的腳本,而不是固定目錄的 /usr/bin/perl ,可以用下面的寫法替代 /usr/bin/perl
#!/usr/bin/env perl
這樣寫,其實就是把perl放到當前環境下,來執行perl了。