linux 环境变量

通过环境变量获取信息,存储临时数据和配置信息

什么是环境变量:(environment variables) 存储有关shell会话和工作环境信息。

它允许你在内存中存储数据,以便运行在shell上的程序和脚本访问。


bash shell里,环境变量分为两类:

1. 全局变量

2 局部变量

不同的linux发行版本可能会有不同的环境变量。


全局环境变量:对所有shell创建的子进程也可见。而局部变量只对创建他们的shell可见。

系统环境变量一律使用全大写以区别普通用户的环境变量。


查看全局变量: printenv

其中大多都是在系统登录时系统设置的。


要显示某个环境变量的值,使用echo命令

echo $HOME

[oh@localhost shell]$ printenv
ORBIT_SOCKETDIR=/tmp/orbit-oh
HOSTNAME=localhost.localdomain
IMSETTINGS_INTEGRATE_DESKTOP=yes
SHELL=/bin/bash
TERM=xterm
XDG_SESSION_COOKIE=b1d24587a88de5a033e32b1000000014-1522602756.176661-1655115006
HISTSIZE=1000
GTK_RC_FILES=/etc/gtk/gtkrc:/home/oh/.gtkrc-1.2-gnome2
WINDOWID=71303172
QTDIR=/usr/lib/qt-3.3
QTINC=/usr/lib/qt-3.3/include
IMSETTINGS_MODULE=IBus
http_proxy=http://127.0.0.1:1080/
USER=oh
LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lz=01;31:*.xz=01;31:*.bz2=01;31:*.tbz=01;31:*.tbz2=01;31:*.bz=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.rar=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=01;36:*.au=01;36:*.flac=01;36:*.mid=01;36:*.midi=01;36:*.mka=01;36:*.mp3=01;36:*.mpc=01;36:*.ogg=01;36:*.ra=01;36:*.wav=01;36:*.axa=01;36:*.oga=01;36:*.spx=01;36:*.xspf=01;36:
SSH_AUTH_SOCK=/tmp/keyring-ZpMk7a/socket.ssh
GNOME_KEYRING_SOCKET=/tmp/keyring-ZpMk7a/socket
SESSION_MANAGER=local/unix:@/tmp/.ICE-unix/2842,unix/unix:/tmp/.ICE-unix/2842
USERNAME=oh
DESKTOP_SESSION=gnome
MAIL=/var/spool/mail/oh
PATH=/usr/lib/qt-3.3/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/oh/bin
QT_IM_MODULE=ibus
PWD=/home/oh/linux/git/manlist/shell
XMODIFIERS=@im=ibus
GDM_KEYBOARD_LAYOUT=us
LANG=en_GB.UTF-8
GNOME_KEYRING_PID=2832
GDM_LANG=en_GB.UTF-8
GDMSESSION=gnome
HISTCONTROL=ignoredups
SSH_ASKPASS=/usr/libexec/openssh/gnome-ssh-askpass
SHLVL=2
HOME=/home/oh
GNOME_DESKTOP_SESSION_ID=this-is-deprecated
HTTP_PROXY=http://127.0.0.1:1080/
LOGNAME=oh
CVS_RSH=ssh
QTLIB=/usr/lib/qt-3.3/lib
DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-vvVcjMENwA,guid=9fa50e34b0b22038787af2560000012a
LESSOPEN=||/usr/bin/lesspipe.sh %s
WINDOWPATH=1
DISPLAY=:0.0
G_BROKEN_FILENAMES=1
XAUTHORITY=/var/run/gdm/auth-for-oh-GjVB0g/database
COLORTERM=gnome-terminal
OLDPWD=/home/oh/linux/git/manlist
_=/usr/bin/printenv
[oh@localhost shell]$ 

[oh@localhost shell]$ echo $HOME
/home/oh
[oh@localhost shell]$ 

================================

局部环境变量:

系统默认也会定义标准的局部环境变量,但是查看局部环境变量有些复杂,没有哪个命令只显示局部环境变量。

set命令会显示为某个特定进程设置的所有环境变量。

[oh@localhost shell]$ set
BASH=/bin/bash
BASHOPTS=checkwinsize:cmdhist:expand_aliases:extquote:force_fignore:hostcomplete:interactive_comments:progcomp:promptvars:sourcepath
BASH_ALIASES=()
BASH_ARGC=()
BASH_ARGV=()
BASH_CMDS=()
BASH_LINENO=()
BASH_SOURCE=()
BASH_VERSINFO=([0]="4" [1]="1" [2]="2" [3]="1" [4]="release" [5]="i386-redhat-linux-gnu")
BASH_VERSION='4.1.2(1)-release'
COLORS=/etc/DIR_COLORS
COLORTERM=gnome-terminal
COLUMNS=79
CVS_RSH=ssh
DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-vvVcjMENwA,guid=9fa50e34b0b22038787af2560000012a
DESKTOP_SESSION=gnome
DIRSTACK=()
DISPLAY=:0.0
EUID=500
GDMSESSION=gnome
GDM_KEYBOARD_LAYOUT=us
GDM_LANG=en_GB.UTF-8
GNOME_DESKTOP_SESSION_ID=this-is-deprecated
GNOME_KEYRING_PID=2832
GNOME_KEYRING_SOCKET=/tmp/keyring-ZpMk7a/socket
GROUPS=()
GTK_RC_FILES=/etc/gtk/gtkrc:/home/oh/.gtkrc-1.2-gnome2
G_BROKEN_FILENAMES=1
HISTCONTROL=ignoredups
HISTFILE=/home/oh/.bash_history
HISTFILESIZE=1000
HISTSIZE=1000
HOME=/home/oh
HOSTNAME=localhost.localdomain
HOSTTYPE=i386
HTTP_PROXY=http://127.0.0.1:1080/
ID=500
IFS=$' \t\n'
IMSETTINGS_INTEGRATE_DESKTOP=yes
IMSETTINGS_MODULE=IBus
LANG=en_GB.UTF-8
LESSOPEN='||/usr/bin/lesspipe.sh %s'
LINES=20
LOGNAME=oh
LS_COLORS='rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lz=01;31:*.xz=01;31:*.bz2=01;31:*.tbz=01;31:*.tbz2=01;31:*.bz=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.rar=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=01;36:*.au=01;36:*.flac=01;36:*.mid=01;36:*.midi=01;36:*.mka=01;36:*.mp3=01;36:*.mpc=01;36:*.ogg=01;36:*.ra=01;36:*.wav=01;36:*.axa=01;36:*.oga=01;36:*.spx=01;36:*.xspf=01;36:'
MACHTYPE=i386-redhat-linux-gnu
MAIL=/var/spool/mail/oh
MAILCHECK=60
OLDPWD=/home/oh/linux/git/manlist
OPTERR=1
OPTIND=1
ORBIT_SOCKETDIR=/tmp/orbit-oh
OSTYPE=linux-gnu
PATH=/usr/lib/qt-3.3/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/oh/bin
PIPESTATUS=([0]="0")
PPID=3590
PROMPT_COMMAND='printf "\033]0;%s@%s:%s\007" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/~}"'
PS1='[\u@\h \W]\$ '
PS2='> '
PS4='+ '
PWD=/home/oh/linux/git/manlist/shell
QTDIR=/usr/lib/qt-3.3
QTINC=/usr/lib/qt-3.3/include
QTLIB=/usr/lib/qt-3.3/lib
QT_IM_MODULE=ibus
SESSION_MANAGER=local/unix:@/tmp/.ICE-unix/2842,unix/unix:/tmp/.ICE-unix/2842
SHELL=/bin/bash
SHELLOPTS=braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor
SHLVL=2
SSH_ASKPASS=/usr/libexec/openssh/gnome-ssh-askpass
SSH_AUTH_SOCK=/tmp/keyring-ZpMk7a/socket.ssh
TERM=xterm
UID=500
USER=oh
USERNAME=oh
WINDOWID=71303172
WINDOWPATH=1
XAUTHORITY=/var/run/gdm/auth-for-oh-GjVB0g/database
XDG_SESSION_COOKIE=b1d24587a88de5a033e32b1000000014-1522602756.176661-1655115006
XMODIFIERS=@im=ibus
_=cls
colors=/etc/DIR_COLORS
http_proxy=http://127.0.0.1:1080/
__udisks () 
{ 
    local IFS='
';
    local cur="${COMP_WORDS[COMP_CWORD]}";
    if [ "${COMP_WORDS[$(($COMP_CWORD - 1))]}" = "--show-info" ]; then
        COMPREPLY=($(compgen -W "$(udisks --enumerate-device-files)" -- $cur));
    else
        if [ "${COMP_WORDS[$(($COMP_CWORD - 1))]}" = "--inhibit-polling" ]; then
            COMPREPLY=($(compgen -W "$(udisks --enumerate-device-files)" -- $cur));
        else
            if [ "${COMP_WORDS[$(($COMP_CWORD - 1))]}" = "--mount" ]; then
                COMPREPLY=($(compgen -W "$(udisks --enumerate-device-files)" -- $cur));
            else
                if [ "${COMP_WORDS[$(($COMP_CWORD - 1))]}" = "--unmount" ]; then
                    COMPREPLY=($(compgen -W "$(udisks --enumerate-device-files)" -- $cur));
                else
                    if [ "${COMP_WORDS[$(($COMP_CWORD - 1))]}" = "--detach" ]; then
                        COMPREPLY=($(compgen -W "$(udisks --enumerate-device-files)" -- $cur));
                    else
                        if [ "${COMP_WORDS[$(($COMP_CWORD - 1))]}" = "--ata-smart-refresh" ]; then
                            COMPREPLY=($(compgen -W "$(udisks --enumerate-device-files)" -- $cur));
                        else
                            if [ "${COMP_WORDS[$(($COMP_CWORD - 1))]}" = "--ata-smart-simulate" ]; then
                                _filedir || return 0;
                            else
                                if [ "${COMP_WORDS[$(($COMP_CWORD - 1))]}" = "--set-spindown" ]; then
                                    COMPREPLY=($(compgen -W "$(udisks --enumerate-device-files)" -- $cur));
                                else
                                    if [ "${COMP_WORDS[$(($COMP_CWORD - 1))]}" = "--poll-for-media" ]; then
                                        COMPREPLY=($(compgen -W "$(udisks --enumerate-device-files)" -- $cur));
                                    else
                                        COMPREPLY=($(IFS=: compgen -W "--dump:--inhibit-polling:--inhibit-all-polling:--enumerate:--enumerate-device-files:--monitor:--monitor-detail:--show-info:--help:--mount:--mount-fstype:--mount-options:--unmount:--unmount-options:--detach:--detach-options:--ata-smart-refresh:--ata-smart-wakeup:--ata-smart-simulate:--set-spindown:--set-spindown-all:--spindown-timeout:--poll-for-media" -- $cur));
                                    fi;
                                fi;
                            fi;
                        fi;
                    fi;
                fi;
            fi;
        fi;
    fi
}
[oh@localhost shell]$ 

===========

设置环境变量:

在shell中: test=hi

注意几点:  

test= hi  不能有空空格,会被当成命令的

[oh@localhost shell]$ t= tr
tr: missing operand
Try `tr --help' for more information.
[oh@localhost shell]$ test = ok
bash: test: =: unary operator expected
[oh@localhost shell]$ 

test=‘ok hi’ 用单引号将字符串引起来 ,如果有空格的话

 由于你创建的是局部变量,所以子shell中是不能访问它的。

---------

现设置全局环境变量:

  先设置局部变量,然后把它导出到全局环境里。 这个过程使用export 命令来完成。这样的话,则其所有子进程都是可见的。

但不是默认shell变量,他们之间还是有区别的。

a=b

export a  注意export到全局环境变量时不使用 $符号

echo $a

------------

好了,现在你想删除环境变量:unset

unset a   也不使用$符号

如果你是在子shell里unset一个环境变量,那么只是删除了子进程的环境变量,父进程是没有删掉这个全局变量的。


=============

shell默认了一些环境变量,由于bash shell 是从 unix Bourne shell 衍生出来的,所以其保留了Unix bourne shell里定义的那些环境变量,也就是相兼容。当然还有一些bash shell自身定义的环境变量。


首先介绍unix bourne shell的变量

HOME:  当前用户的主目录

PATH:  冒号分隔的shell查找命令的目录列表

PS1: shell命令行界面的主提示符

PS2: shell命令行界面的次提示符

IFS: shel用来分隔文本字符串的一系列字符


===========


设置PATH环境变量:

  你随便输入个字符串  llll

-bash会提示你  这个东西没找到。PATH设置了命令的搜索路径,因为在这些路径里没有你要的那个命令文件,于是出错了。

所以如果你想将一个存放命令的目录放到PATH里,就得这样做

PATH=$PATH:/home/bin

之所以要加:是因为path里的各个目录是以:分隔的

那么你可以在任何的目录下执行放在/home/bin下的可执行文件了。


但是这样做只是本次登录path 有被改变,下次登录又会重新重置了。

于是 定位系统环境变量:

    首先,你在脚本,或者输入命令时,肯定是在bash shell里,那么默认情况下bash会在几个文件里查找命令,这些文件被称为启动文件,而这些启动文件的执行顺序又与你怎样启动bash shell有关系:

     启动bash shell 有三种方式:    

1.登录时被当作默认的shell

   一般来说,登录时默认都是 bash shell    : 此时会依次执行:   

/etc/profile   无论什么用户都会执行的主启动文件

$HOME/.bash_profile    

$HOME/.bash_login

$HOME/.profile

其它三个为用户自定义的


而在/etc/profile里的最后两个部分:

 一是导出行:  export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL

这保证了这些环境变量(在/etc/profile里定义)对这个登录shell创建所有子进程都有效。

二是for语句:会逐一访问位于 /etc/profile.d目录,里的每个文件。这些地方为系统提供了一个集中存放用户登陆时要执行的应用专属的启动文件的地方。他们基本上跟系统上的特定应用有关。你会看到有些是.sh给bash shell 有些是.csh给 c shell

其中的lang.sh 与lang.csh 会区设置LANG环境变量

~~~~

现在来说后三个自定义文件,你可以在这里面添加要的目录到PATH里。大多数Linux的发行版本只启动三个文件中的一个。

先是说.bash_profile文件,它会先检查HOME目录下是否还有一个叫  .bashrc的启动文件,有的话,会先执行它。

具体看具体文件里的写法。


2.作为非登录shell的交互式shell

  什么叫交互式shell,你在命令提示符下 敲 bash而启动的shell,就称为交互式shell。

在交互式shell里,它不会区访问/etc/profile文件了。而是去用户的HOME目录检查.bashrc是否存在。

而.bashrc又会查看/ect/  目录下用户共用的 bashrc文件,和为用户提供了一个定制自己命令别名 和私有脚本函数的地方。



3.作为运行脚本的非交互式shell

系统执行shell脚本时用的就是这种shell,虽然没有命令提示符,但当你每次在系统上运行脚本时仍要运行特定的启动命令。于是出现了 BASH_ENV环境变量,当非交互式shell时,会执行变量来查看要执行的启动文件。


===================

环境变量可以做数组使用。

abc=(we rt hg)

括号括起来,中间用空格

当   echo $abc 

只显示  第一个 we

要访问其他数据,类似于数组  echo ${abc[1]}  --------> rt

是的,下标从0开始

若要显示整个数组内容   echo ${abc[*]}   这样才行------------->we rt hg

这个叫可变数组:当你unset abc[1]时    abc【1】不是变成了0,而是没东西了,abc[1]=空了。

如果 unset abc  就是删除整个abc

可变数组不建议经常使用,虽然bash很多这样的可变数组,但是使用他们会让事情变得麻烦。


=================

使用命令别名,也就是给命令起个名字。

可以使用  alias -p   来查看已有的别名列标

如果你想自己设置命令别名  得使用 alias 命令

alias www='ls -l -a'

但是这样也就只有这个shell可以使用,需要放在启动文件里。

而只要是交互式shell,就会访问  $HOME/.bashrc    文件,所以,在那里去使用 alias设置别名吧。




















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值