zoukankan      html  css  js  c++  java
  • Linux环境变量

    1.环境变量

    $HOME表示的是某个用户的主目录。它和波浪号(~)的作用一样

    全局环境变量对于shell会话和所有生成的子shell都是可见的。

    局部变量则只对创建它们的shell可见。

    查看全局变量用printenv或env

    查看个别环境变量的值用:printenv 环境变量

    例如:printenv HOME //查看HOME这个环境变量的值

    2.如何设置环境变量

    设置局部环境变量:

      echo $my_variable
      my_variable=Hello

      若变量需要赋含有空格的字符串值,则需要用双引号""来界定含空格字符串首尾

      echo my_variable
      my_variable="Hello World"

    所有的环境变量名均使用大写字母,这是bash shell的标准惯例。如果是你自己创建的局部变量或是shell脚本,请使用小写字母。变量名区分大小写。在涉及用户定义的局部变量时坚持使用小写字母,这能够避免重新定义系统环境变量可能带来的灾难。
    设置了局部环境变量后,就能在shell进程的任何地方使用它了。但是,如果生成了另外一个shell,它在子shell中就不可用。

    创建全局变量的方法是:先创建一个局部变量,然后在导出到全局环境中(该过程由export完成,变量名前不需要加$):

      my_variable="I am Global Now"
      export my_variable

    在定义并导出变量my_variable后,bash命令启动了一个子shell。在这个子shell中能够正确显示出全局环境变量my_variable的值。子shell随后改变了这个变量的值。但是这种改变仅在子shell中有效,并不会被反映到父shell中。子shell甚至无法使用export命令改变父shell中全局环境变量的值。  

    使用unset删除环境变量,不需加$
      unset my_variable
    关于使用$:如果要用到变量,使用$;如果要操作变量,不使用$。

    系统自有的变量:
    CDPATH 冒号分隔的目录列表,作为cd命令的搜索路径
    HOME 当前用户的主目录
    IFS shell用来将文本字符串分割成字段的一系列字符
    MAIL 当前用户收件箱的文件名(bash shell会检查这个文件,看看有没有新邮件)
    MAILPATH 冒号分隔的当前用户收件箱的文件名列表(bash shell会检查列表中的每个文件,看看有没有新邮件)
    OPTARG getopts命令处理的最后一个选项参数值
    OPTIND getopts命令处理的最后一个选项参数的索引号
    PATH shell查找命令的目录列表,由冒号分隔
    PS1 shell命令行界面的主提示符
    PS2 shell命令行界面的次提示符
    BASH 当前shell实例的全路径名
    BASH_ALIASES 含有当前已设置别名的关联数组
    BASH_ARGC 含有传入子函数或shell脚本的参数总数的数组变量
    BASH_ARCV 含有传入子函数或shell脚本的参数的数组变量
    BASH_CMDS 关联数组,包含shell执行过的命令的所在位置
    BASH_COMMAND shell正在执行的命令或马上就执行的命令
    BASH_ENV 设置了的话,每个bash脚本会在运行前先尝试运行该变量定义的启动文件
    BASH_EXECUTION_STRING 使用bash -c选项传递过来的命令
    BASH_LINENO 含有当前执行的shell函数的源代码行号的数组变量
    BASH_REMATCH 只读数组,在使用正则表达式的比较运算符=~进行肯定匹配(positive match)时,包含了匹配到的模式和子模式
    BASH_SOURCE 含有当前正在执行的shell函数所在源文件名的数组变量
    BASH_SUBSHELL 当前子shell环境的嵌套级别(初始值是0)
    BASH_VERSINFO 含有当前运行的bash shell的主版本号和次版本号的数组变量
    BASH_VERSION 当前运行的bash shell的版本号
    BASH_XTRACEFD 若设置成了有效的文件描述符(0、1、2),则'set -x'调试选项生成的跟踪输出可被重定向。通常用来将跟踪输出到一个文件中
    BASHOPTS 当前启用的bash shell选项的列表
    BASHPID 当前bash进程的PID
    COLUMNS 当前bash shell实例所用终端的宽度
    COMP_CWORD COMP_WORDS变量的索引值,后者含有当前光标的位置
    COMP_LINE 当前命令行
    COMP_POINT 当前光标位置相对于当前命令起始的索引
    COMP_KEY 用来调用shell函数补全功能的最后一个键
    COMP_TYPE 一个整数值,表示所尝试的补全类型,用以完成shell函数补全
    COMP_WORDBREAKS Readline库中用于单词补全的词分隔字符
    COMP_WORDS 含有当前命令行所有单词的数组变量
    COMPREPLY 含有由shell函数生成的可能填充代码的数组变量
    COPROC 占用未命名的协进程的I/O文件描述符的数组变量
    DIRSTACK 含有目录栈当前内容的数组变量
    EMACS 设置为't'时,表明emacs shell缓冲区正在工作,而行编辑功能被禁止
    ENV 如果设置了该环境变量,在bash shell脚本运行之前会先执行已定义的启动文件(仅用于当bash shell以POSIX模式被调用时)
    EUID 当前用户的有效用户ID(数字形式)
    FCEDIT 供fc命令使用的默认编辑器
    FIGNORE 在进行文件名补全时可以忽略后缀名列表,由冒号分隔
    FUNCNAME 当前执行的shell函数的名称
    FUNCNEST 当设置成非零值时,表示所允许的最大函数嵌套级数(一旦超出,当前命令即被终止)
    GLOBIGNORE 冒号分隔的模式列表,定义了在进行文件名扩展时可以忽略的一组文件名
    GROUPS 含有当前用户属组列表的数组变量
    histchars 控制历史记录扩展,最多可有3个字符
    HISTCMD 当前命令在历史记录中的编号
    HISTCONTROL 控制哪些命令留在历史记录列表中
    HISTFILE 保存shell历史记录列表的文件名(默认是.bash_history)
    HISTFILESIZE 最多在历史文件中存多少行
    HISTTIMEFORMAT 如果设置了且非空,就用作格式化字符串,以显示bash历史中每条命令的时间戳
    HISTIGNORE 由冒号分隔的模式列表,用来决定历史文件中哪些命令会被忽略
    HISTSIZE 最多在历史文件中存多少条命令
    HOSTFILE shell在补全主机名时读取的文件名称
    HOSTNAME 当前主机的名称
    HOSTTYPE 当前运行bash shell的机器
    IGNOREEOF shell在退出前必须收到连续的EOF字符的数量(如果这个值不存在,默认是1)
    INPUTRC Readline初始化文件名(默认是.inputrc)
    LANG shell的语言环境类别
    LC_ALL 定义了一个语言环境类别,能够覆盖LANG变量
    LC_COLLATE 设置对字符串排序时用的排序规则
    LC_CTYPE 决定如何解释出现在文件名扩展和模式匹配中的字符
    LC_MESSAGES 在解释前面带有$的双引号字符串时,该环境变量决定了所采用的语言环境设置
    LC_NUMERIC 决定着格式化数字时采用的语言环境设置
    LINENO 当前执行的脚本的行号
    LINES 定义了终端上可见的行数
    MACHTYPE 用“CPU-公司-系统”(CPU-company-system)格式定义的系统类型
    MAPFILE 一个数组变量,当mapfile命令未指定数组变量作为参数时,它存储了mapfile所读入的文本
    MAILCHECK shell查看新邮件的频率(以秒为单位,默认值是60)
    OLDPWD shell之前的工作目录
    OPTERR 设置为1时,bash shell会显示getopts命令产生的错误
    OSTYPE 定义了shell所在的操作系统
    PIPESTATUS 含有前台进程的退出状态列表的数组变量
    POSIXLY_CORRECT 设置了的话,bash会以POSIX模式启动
    PPID bash shell父进程的PID
    PROMPT_COMMAND 设置了的话,在命令行主提示符显示之前会执行这条命令
    PROMPT_DIRTRIM 用来定义当启用了w或W提示符字符串转义时显示的尾部目录名的数量。被删除的目录名会用一组英文句点替换
    PS3 select命令的提示符
    PS4 如果使用了bash的-x选项,在命令行之前显示的提示信息
    PWD 当前工作目录
    RANDOM 返回一个0~32767的随机数(对其的赋值可作为随机数生成器的种子)
    READLINE_LINE 当使用bind –x命令时,存储Readline缓冲区的内容
    READLINE_POINT 当使用bind –x命令时,表示Readline缓冲区内容插入点的当前位置
    REPLY read命令的默认变量
    SECONDS 自从shell启动到现在的秒数(对其赋值将会重置计数器)
    SHELL bash shell的全路径名
    SHELLOPTS 已启用bash shell选项列表,列表项之间以冒号分隔
    SHLVL shell的层级;每次启动一个新bash shell,该值增加1
    TIMEFORMAT 指定了shell的时间显示格式
    TMOUT select和read命令在没输入的情况下等待多久(以秒为单位)。默认值为0,表示无限长
    TMPDIR 目录名,保存bash shell创建的临时文件
    UID 当前用户的真实用户ID(数字形式)

    设置PATH环境变量:
      PATH=$PATH:新变量位置
    对PATH变量的修改只能持续到退出或重启系统。


    3.登录Shell
    登录shell会从5个不同的启动文件里读取命令:
    /etc/profile
    $HOME/.bash_profile
    $HOME/.bashrc
    $HOME/.bash_login
    $HOME/.profile
    /etc/profile文件是系统上默认的bash shell的主启动文件。系统上的每个用户登录时都会执行这个启动文件。

    要留意的是:有些Linux发行版使用了可拆卸式认证模块(Pluggable Authentication Modules ,PAM)。在这种情况下,PAM文件会在bash shell启动之前处理,这些文件中可能会包含环境变量。PAM文件包括/etc/environment文件和$HOME/.pam_environment文件。

    大部分应用都会创建两个启动文件:一个提供bash shell使用(使用.sh扩展名),一个供c shell使用(使用.csh扩展名)

    lang.csh和lang.sh文件会尝试去判定系统上所采用的默认语言字符集,然后设置对应的LANG环境变量

    $HOME目录下的启动文件
    剩下的启动文件都起着同一个作用:提供一个用户专属的启动文件来定义该用户所用到的环境变量。大多数Linux发行版只用这四个启动文件中的一到两个:
    $HOME/.bash_profile
    $HOME/.bashrc
    $HOME/.bash_login
    $HOME/.profile
    注意,这四个文件都以点号开头,这说明它们是隐藏文件(不会在通常的ls命令输出列表中出现)。它们位于用户的HOME目录下,所以每个用户都可以编辑这些文件并添加自己的环境变量,这些环境变量会在每次启动bash shell会话时生效
    说明 Linux发行版在环境文件方面存在的差异非常大。本节中所列出的$HOME下的那些文件并非每个用户都有。例如有些用户可能只有一个$HOME/.bash_profile文件

    shell会按照下列顺序,运行第一个被找到的文件,余下的则被忽略:
    $HOME/.bash_profile
    $HOME/.bash_login
    $HOME/.profile


    4.交互式shell进程
      如果你的bash shell不是登录系统时启动的(比如是在命令行提示符下敲入bash时启动),那么你启动的shell叫作交互式shell。交互式shell不会像登录shell一样运行,但它依然提供了命令行提示符来输入命令。

    如果bash是作为交互式shell启动的,它就不会访问/etc/profile文件,只会检查用户HOME目录中的.bashrc文件。

    .bashrc文件有两个作用:一是查看/etc目录下通用的bashrc文件,二是为用户提供一个定制自己的命令别名和私有脚本函数的地方。

    5.非交互式 shell
      最后一种shell是非交互式shell。系统执行shell脚本时用的就是这种shell。不同的地方在于它没有命令行提示符。但是当你在系统上运行脚本时,也许希望能够运行一些特定启动的命令。
    为了处理这种情况,bash shell提供了BASH_ENV环境变量。当shell启动一个非交互式shell进程时,它会检查这个环境变量来查看要执行的启动文件。如果有指定的文件,shell会执行该文件里的命令,这通常包括shell脚本变量设置。
    由父shell设置但并未导出的变量都是局部变量。子shell无法继承局部变量。
    对于那些不启动子shell的脚本,变量已经存在于当前shell中了。所以就算没有设置BASH_ENV,也可以使用当前shell的局部变量和全局变量。

    6.环境变量持久化
      对全局环境变量来说(Linux系统中所有用户都需要使用的变量),可能更倾向于将新的或修改过的变量设置放在/etc/profile文件中,但这可不是什么好主意。如果你升级了所用的发行版,这个文件也会跟着更新,那你所有定制过的变量设置可就都没有了。
    最好是在/etc/profile.d目录中创建一个以.sh结尾的文件。把所有新的或修改过的全局环境变量设置放在这个文件中。
    在大多数发行版中,存储个人用户永久性bash shell变量的地方是$HOME/.bashrc文件。这一点适用于所有类型的shell进程。但如果设置了BASH_ENV变量,那么记住,除非它指向的是$HOME/.bashrc,否则你应该将非交互式shell的用户变量放在别的地方。
    图形化界面组成部分(如GUI客户端)的环境变量可能需要在另外一些配置文件中设置,这和设置bash shell环境变量的地方不一样。

    7.数组变量

      要给某个环境变量设置多个值,可以把值放在括号里,值与值之间用空格分隔

      例如:mytest=(ine tow three four five)

      要引用一个单独的数组元素,必须用代表它在数组中位置的数值索引值。索引值要用方括号括起来(环境变量数组的索引值都是从零开始)

      例如:echo ${mytest[2]}

      要显示整个数组变量,可以用星号作为通配符放在索引值的位置

      例如:echo ${mytest[*]}

      用unset命令删除索引值上的值的时候,其它索引值不变,被删除了的索引值内容为空

  • 相关阅读:
    SpringCloud学习系列之四-----配置中心(Config)使用详解
    阿里云Docker镜像仓库(Docker Registry)
    阿里云Docker镜像加速
    Docker安装(yum方式 centos7)
    Docker Nginx安装(centos7)
    Dockerfile文件详解
    mysql 开发进阶篇系列 6 锁问题(事务与隔离级别介绍)
    mysql 开发进阶篇系列 5 SQL 优化(表优化)
    mysql 开发进阶篇系列 4 SQL 优化(各种优化方法点)
    sql server 性能调优之 资源等待PAGELATCH
  • 原文地址:https://www.cnblogs.com/feather-crane/p/11794167.html
Copyright © 2011-2022 走看看