Linux系統裡的env命令可以顯示目前使用者的環境變數,還可以用來在指定環境變數下執行其他命令。下面來比較一下set,env和export命令的異同:set命令顯示當前shell的變數,包括目前使用者的變數;env命令顯示目前使用者的變數;export命令顯示當前置出成使用者變數的shell變數。每個shell有自己特有的變數set)顯示的變數,這個和使用者變數是不同的,目前使用者變數和你用什麼shell無關,不管你用什麼shell都在,比如HOME,SHELL等這些變數,但shell自己的變數不同shell是不同的,比如BASH_ARGC,BASH等,這些變數只有set才會顯示,是bash特有的,export不加參數的時候,顯示哪些變數被匯出成了使用者變數,因為一個shell自己的變數可以通過export “匯出”變成一個使用者變數。
常用方式
格式:env
列印目前使用者的環境變數。
格式:env -i NAME1=VALUE1 NAME2=VALUE2 <command-line>
使用指定的環境變數執行命令列<command-line>。
使用樣本
樣本一:比較env,set和export
set命令列印的資訊最多,包括自訂函數等,以至於要使用more才能看得清。
[root@www.linuxidc.com ~]# envHOSTNAME=webTERM=linuxSHELL=/bin/bashHISTSIZE=1000SSH_CLIENT=58.222.185.248 1113 22SSH_TTY=/dev/pts/6ANT_HOME=/opt/apache/apache-ant-1.8.1USER=rootLS_COLORS=no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:bd=40;33;01:cd=40;33;01:or=01;05;37;41:mi=01;05;37;41:ex=01;32:*.cmd=01;32:*.exe=01;32:*.com=01;32:*.btm=01;32:*.bat=01;32:*.sh=01;32:*.csh=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.gz=01;31:*.bz2=01;31:*.bz=01;31:*.tz=01;31:*.rpm=01;31:*.cpio=01;31:*.jpg=01;35:*.gif=01;35:*.bmp=01;35:*.xbm=01;35:*.xpm=01;35:*.png=01;35:*.tif=01;35:SSH_AUTH_SOCK=/tmp/ssh-amfuW25778/agent.25778MAIL=/var/spool/mail/rootPATH=/usr/kerberos/sbin:/usr/kerberos/bin:/opt/apache/apache-ant-1.8.1/bin:/usr/java/jdk1.6.0_20/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/binINPUTRC=/etc/inputrcPWD=/rootJAVA_HOME=/usr/java/jdk1.6.0_20LANG=zh_CN.GB18030SSH_ASKPASS=/usr/libexec/openssh/gnome-ssh-askpassSHLVL=1HOME=/rootLOGNAME=rootCVS_RSH=sshSSH_CONNECTION=58.222.185.248 1113 218.23.142.44 22LESSOPEN=|/usr/bin/lesspipe.sh %sG_BROKEN_FILENAMES=1_=/bin/env[root@www.linuxidc.com ~]# exportdeclare -x ANT_HOME="/opt/apache/apache-ant-1.8.1"declare -x CVS_RSH="ssh"declare -x G_BROKEN_FILENAMES="1"declare -x HISTSIZE="1000"declare -x HOME="/root"declare -x HOSTNAME="web"declare -x INPUTRC="/etc/inputrc"declare -x JAVA_HOME="/usr/java/jdk1.6.0_20"declare -x LANG="zh_CN.GB18030"declare -x LESSOPEN="|/usr/bin/lesspipe.sh %s"declare -x LOGNAME="root"declare -x LS_COLORS="no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:bd=40;33;01:cd=40;33;01:or=01;05;37;41:mi=01;05;37;41:ex=01;32:*.cmd=01;32:*.exe=01;32:*.com=01;32:*.btm=01;32:*.bat=01;32:*.sh=01;32:*.csh=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.gz=01;31:*.bz2=01;31:*.bz=01;31:*.tz=01;31:*.rpm=01;31:*.cpio=01;31:*.jpg=01;35:*.gif=01;35:*.bmp=01;35:*.xbm=01;35:*.xpm=01;35:*.png=01;35:*.tif=01;35:"declare -x MAIL="/var/spool/mail/root"declare -x OLDPWDdeclare -x PATH="/usr/kerberos/sbin:/usr/kerberos/bin:/opt/apache/apache-ant-1.8.1/bin:/usr/java/jdk1.6.0_20/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin"declare -x PWD="/root"declare -x SHELL="/bin/bash"declare -x SHLVL="1"declare -x SSH_ASKPASS="/usr/libexec/openssh/gnome-ssh-askpass"declare -x SSH_AUTH_SOCK="/tmp/ssh-amfuW25778/agent.25778"declare -x SSH_CLIENT="58.222.185.248 1113 22"declare -x SSH_CONNECTION="58.222.185.248 1113 218.23.142.44 22"declare -x SSH_TTY="/dev/pts/6"declare -x TERM="linux"declare -x USER="root"[root@www.linuxidc.com ~]# set | moreANT_HOME=/opt/apache/apache-ant-1.8.1BASH=/bin/bashBASH_ARGC=()BASH_ARGV=()BASH_COMPLETION=/etc/bash_completionBASH_COMPLETION_DIR=/etc/bash_completion.dBASH_LINENO=()BASH_SOURCE=()BASH_VERSINFO=([0]="3" [1]="2" [2]="25" [3]="1" [4]="release" [5]="i686-RedHat-linux-gnu")BASH_VERSION='3.2.25(1)-release'COLORS=/etc/DIR_COLORSCOLUMNS=132CVS_RSH=sshDIRSTACK=()EUID=0GROUPS=()G_BROKEN_FILENAMES=1HISTFILE=/root/.bash_historyHISTFILESIZE=1000HISTSIZE=1000HOME=/rootHOSTNAME=webHOSTTYPE=i686IFS=$' \t\n'INPUTRC=/etc/inputrcJAVA_HOME=/usr/java/jdk1.6.0_20LANG=zh_CN.GB18030LESSOPEN='|/usr/bin/lesspipe.sh %s'LINES=41LOGNAME=rootLS_COLORS='no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:bd=40;33;01:cd=40;33;01:or=01;05;37;41:mi=01;05;37;41:ex=01;32:*.cmd=01;32:*.exe=01;32:*.com=01;32:*.btm=01;32:*.bat=01;32:*.sh=01;32:*.csh=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.gz=01;31:*.bz2=01;31:*.bz=01;31:*.tz=01;31:*.rpm=01;31:*.cpio=01;31:*.jpg=01;35:*.gif=01;35:*.bmp=01;35:*.xbm=01;35:*.xpm=01;35:*.png=01;35:*.tif=01;35:'MACHTYPE=i686-RedHat-linux-gnuMAIL=/var/spool/mail/rootMAILCHECK=60OPTERR=1OPTIND=1OSTYPE=linux-gnu--More--
樣本二 service命令的原始碼中用到了env命令
可以看出service在執行別的命令式,只有三個環境變數:LANG, PATH, TERM。
[root@www.linuxidc.com ~]# grep env /sbin/service
env -i LANG="$LANG" PATH="$PATH" TERM="$TERM" "${SERVICEDIR}/${SERVICE}" status
env -i LANG="$LANG" PATH="$PATH" TERM="$TERM" "${SERVICEDIR}/${SERVICE}" stop
env -i LANG="$LANG" PATH="$PATH" TERM="$TERM" "${SERVICEDIR}/${SERVICE}" start
env -i LANG="$LANG" PATH="$PATH" TERM="$TERM" "${SERVICEDIR}/${SERVICE}" ${OPTIONS}
[root@www.linuxidc.com ~]#