导读:
Linux系统里的env命令可以显示当前用户的环境变量,还可以用来在指定环境变量下执行其他命令。
下面来比较一下 set,env和export命令的异同:
1 set命令显示当前shell的变量,包括当前用户的变量; 2 3 env命令显示当前用户的变量; 4 5 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才能看得清。
1 [root@localhost ~]# set #代码太多,只截取部分 2 ABRT_DEBUG_LOG=/dev/null 3 BASH=/usr/bin/bash 4 BASHOPTS=checkwinsize:cmdhist:expand_aliases:extglob:extquote:force_fignore:histappend:interactive_comments:progcomp:promptvars:sourcepath 5 BASH_ALIASES=() 6 BASH_ARGC=() 7 BASH_ARGV=() 8 BASH_CMDS=() 9 BASH_COMPLETION_COMPAT_DIR=/etc/bash_completion.d 10 BASH_LINENO=([0]="22") 11 BASH_REMATCH=() 12 BASH_SOURCE=([0]="/etc/profile.d/vte.sh") 13 BASH_VERSINFO=([0]="4" [1]="2" [2]="46" [3]="2" [4]="release" [5]="x86_64-redhat-linux-gnu") 14 BASH_VERSION='4.2.46(2)-release' 15 COLORTERM=truecolor 16 COLUMNS=132 17 COMP_WORDBREAKS=$' \t\n"\'><=;|&(:' 18 DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-cpDBQiyzht,guid=0ebc3f2ba2d2fd3594778f225be6952d 19 DESKTOP_SESSION=gnome-classic 20 DIRSTACK=() 21 DISPLAY=:0 22 EUID=0 23 FINAL_LIST= 24 GDMSESSION=gnome-classic 25 GDM_LANG=zh_CN.UTF-8 26 GLUSTER_BARRIER_OPTIONS=$'\n {enable},\n {disable}\n' 27 GLUSTER_COMMAND_TREE=$'\n{gluster [\n \n {volume [\n {add-brick\n {__VOLNAME}\n },\n {barrier\n {__VOLNAME\n [ \n {enable},\n {disable}\n ]\n }\n },\n {clear-locks\n {__VOLNAME}\n },\n {create},\n {delete\n {__VOLNAME}\n },\n {geo-replication\n [ \n {__VOLNAME [\n {__SLAVEURL [\n {create [\n {push-pem\n {force}\n },\n {force}\n ]\n },\n {start {force} },\n {status {detail} },\n {config},\n {pause {force} },\n {resume {force} },\n {stop {force} },\n {delete {force} }\n ]\n },\n {status}\n ]\n },\n {status}\n ]\n },\n {heal\n {__VOLNAME}\n },\n 28 29 30 31 [root@localhost ~]# export #代码太多,只截取部分 32 declare -x COLORTERM="truecolor" 33 declare -x DBUS_SESSION_BUS_ADDRESS="unix:abstract=/tmp/dbus-cpDBQiyzht,guid=0ebc3f2ba2d2fd3594778f225be6952d" 34 declare -x DESKTOP_SESSION="gnome-classic" 35 declare -x DISPLAY=":0" 36 declare -x GDMSESSION="gnome-classic" 37 declare -x GDM_LANG="zh_CN.UTF-8" 38 declare -x GNOME_DESKTOP_SESSION_ID="this-is-deprecated" 39 declare -x GNOME_SHELL_SESSION_MODE="classic" 40 declare -x HISTCONTROL="ignoredups" 41 declare -x HISTSIZE="1000" 42 declare -x HOME="/root" 43 declare -x HOSTNAME="localhost.localdomain" 44 declare -x IMSETTINGS_INTEGRATE_DESKTOP="yes" 45 declare -x IMSETTINGS_MODULE="IBus" 46 declare -x LANG="zh_CN.UTF-8" 47 declare -x LESSOPEN="||/usr/bin/lesspipe.sh %s" 48 declare -x LOGNAME="zhou" 49 50 51 52 [root@localhost ~]# env #代码太多,只截取部分 53 XDG_VTNR=1 54 XDG_SESSION_ID=2 55 SSH_AGENT_PID=1808 56 HOSTNAME=localhost.localdomain 57 IMSETTINGS_INTEGRATE_DESKTOP=yes 58 XDG_MENU_PREFIX=gnome- 59 SHELL=/bin/bash 60 TERM=xterm-256color 61 VTE_VERSION=4602 62 HISTSIZE=1000 63 WINDOWID=27262982 64 IMSETTINGS_MODULE=IBus 65 USER=zhou 66 LS_COLORS=rs=0:di=38;5;27:ln=38;5;51:mh=44;38;5;15:pi=40;38;5;11:so=38;5;13:do=38;5;5:bd=48;5;232;38;5;11:cd=48;5;232;38;5;3:or=48;5;232;38;5;9:mi=05;48;5;232;38;5;15:su=48;5;196;38;5;15:sg=48;5;11;38;5;16:ca=48;5;196;38;5;226:tw=48;5;10;38;5;16:ow=48;5;10;38;5;21:st=48;5;21;38;5;15:ex=38;5;34:*.tar=38;5;9:*.tgz=38;5;9:*.arc=38;5;9:*.arj=38;5;9:*.taz=38;5;9:*.lha=38;5;9:*.lz4=38;5;9:*.lzh=38;5;9:*.lzma=38;5;9:*.tlz=38;5;9:*.txz=38;5;9:*.tzo=38;5;9:*.t7z=38;5;9:*.zip=38;5;9:*.z=38;5;9:*.Z=38;5;9:*.dz=38;5;9:*.gz=38;5;9:*.lrz=38;5;9:*.lz=38;5;9:*.lzo=38;5;9:*.xz=38;5;9:*.bz2=38;5;9:*.bz=38;5;9:*.tbz=38;5;9:*.tbz2=38;5;9:*.tz=38;5;9:*.deb=38;5;9:*.rpm=38; 67
示例二 :service命令的源代码中用到了env命令
可以看出service在执行别的命令式,只有三个环境变量:LANG, PATH, TERM。
1 [root@localhost ~]# grep env /sbin/service 2 env -i PATH="$PATH" TERM="$TERM" "${SERVICEDIR}/${SERVICE}" status 3 env -i PATH="$PATH" TERM="$TERM" "${SERVICEDIR}/${SERVICE}" stop 4 env -i PATH="$PATH" TERM="$TERM" "${SERVICEDIR}/${SERVICE}" start 5 env -i PATH="$PATH" TERM="$TERM" SYSTEMCTL_IGNORE_DEPENDENCIES=${SYSTEMCTL_IGNORE_DEPENDENCIES} SYSTEMCTL_SKIP_REDIRECT=${SYSTEMCTL_SKIP_REDIRECT} "${SERVICEDIR}/${SERVICE}" ${ACTION} ${OPTIONS} 6 env -i PATH="$PATH" TERM="$TERM" SYSTEMCTL_IGNORE_DEPENDENCIES=${SYSTEMCTL_IGNORE_DEPENDENCIES} SYSTEMCTL_SKIP_REDIRECT=${SYSTEMCTL_SKIP_REDIRECT} "${ACTIONDIR}/${SERVICE}/${ACTION}" ${OPTIONS}