辛星浅谈Linux中的环境变量

全局变量和本地环境变量:

bash  shell使用一种称为环境变量的特性来存储关于shell会话和工作环境的信息,这也是环境变量的名字的由来。该特性还允许我们把数据存储在内存中,以便于在shell中运行的程序或者脚本中访问它们。bash  shell中共有两种类型的环境变量:全局变量和本地变量。

全局环境变量在shell会话和该shell产生的任何子进程中都可见。而本地变量则只在创建它们的shell中可见。在产生需要父进程信息的子进程的应用程序中,这便体现了全局变量的重要作用。系统环境变量使用使用全大写字母来区别于普通用户环境变量。我们使用printenv命令来查看全局环境变量。要查看某个全局变量的值,我们可以使用echo命令,但是在引用某个环境变量名称的时候,我们需要添加一个美元符号,比如echo $HOME来查看家目录。没有任何命令可以只显示本地环境变量,我们可以使用set命令来显示特定进程的所有环境变量集,这其中也包括了全局环境变量。也就是说我们的printenv命令所看到的所有的全局变量都出现在了set命令的输出中。

设置本地环境变量:

我们可以创建在shell进程中可见的本地变量。我们可以为环境变量分配一个数值或者一个字符串,方法是使用等号将变量指定为具体值,比如test=xin,然后我们使用echo  $test就可以输出该变量值了。如果我们要指定包含空格的字符串值,我们需要使用单引号来括起来指定字符的起始位置。如果我们没有使用单引号,bash  shell将假定下一个字符是另一个命令。

我们bash  shell中的一个约定就是,如果创建新环境变量,建议使用小写字母。它有助于我们区分个人环境变量与系统环境变量。

需要注意的是,环境变量名称、等号和值之间不能有空格,这一点很重要,如果我们在其中添加了任何的空格,那么bash  shell会把值解释为一个单独的命令。

我们设置了本地变量之后,我们可以在shell进程的任何地方使用它。但是,如果产生了另外一个shell,则不能在子shell中使用它,我们可以用exit来退出子shell,返回到父shell,当然我们可以用bash来进入一个子shell。

设置全局环境变量:

全局环境变量在任何由设置全局环境变量的进程创建的子进程中都可见。创建全局环境变量的方法是创建一个本地环境变量,然后使用export来把它到处到全局环境中。比如我们首先>test=xin,然后>export  test。

这里的export命令让它具有了全局性,在导出本地环境变量时,我们不必使用美元符号来引用变量的名称。

移除环境变量:

我们使用unset来移除环境变量,操作范例unset   test,注意这里不要使用美元符号。在操作全局环境变量时,如果我们在子进程中使用unset移除全局环境变量,则该操作只对子进程有效,全局环境变量在父进程中依然可用。

默认的shell环境变量:

(1)CDPATH  冒号分割的目录列表,用作cd命令的搜索路径

(2)HOME     当前用户的主目录

(3)IFS      用于分割字段的字符列表,shell使用它们分割文本字符串

(4)MAIL     当前用户邮箱的文件名,对于新邮件,bash  shell将检查该文件

(5)MAILPATH   当前用户邮箱的多个文件名,由冒号分割,对于新邮件,bash shell将检查该列表中的各个文件

(6)OPTARG     getopts命令处理的最后一个选项参数的值

(7)OPTIND      getopts命令处理的最后一个选项参数的索引值

(8)PATH     冒号分隔的目录列表,shell将在这些目录中查找命令

(9)PS1          主shell命令行界面提示字符串

(10)PS2         次shell命令行界面提示字符串

设置PATH环境变量:

(1)注意:PATH还显示了shell查找命令的顺序

(2)比如我们在PATH中追加一个目录,我们可以使用如下的格式范例:PATH=$PATH:/home/xin/test

(3)我们把某些命令的目录追加到PATH环境变量中,我们可以在虚拟目录结构的任何位置执行我们的程序。

(4)我们经常用的一个技巧就是在我们的PATH环境变量中包括一个点符号,这个点符号代表当前目录。

定位系统环境变量:

通过登录Linux系统启动bash  shell时,bash默认将检查一些文件以执行命令,这些文件被称为启动文件。bash处理的启动文件依赖于启动bash  shell的方法,我们可以用三种方法来启动bash  shell:①在登录时作为默认登录shell。②作为非登录shell的交互式shell。③作为非交互式shell运行脚本。

登录shell:

登录shell将查找四个不同的启动文件来处理当前的命令:/etc/profile、$HOME/.bash_profile、$HOME/.bash_login、$HOME/.profile

其中/etc/profile文件是bash  shell在系统上的主默认启动文件,系统上的每一个用户在登录时都将执行此启动文件,另外三个启动文件特定于各个用户,并且可以根据各用户的需求自定义它们。当我们登录Linux操作系统时,bash将执行/etc/profile启动文件中的命令。我们还注意到该文件中会export很多的变量为全局变量。

profile文件还使用了另外一个技巧性的特性,那就是能够迭代/etc/profile.d目录中的任何文件的for语句,这使得Linux系统提供了一个放置特定于应用程序的启动文件,这些文件将在我们登录时由shell执行。

对于$HOME目录下的三个文件,它们具有相同的功能,它们提供特定于用户的启动文件,用于定义特定于用户的环境变量,大多数Linux发行版都是使用三者之一,也就是.bash_profile或者.bash_login或者.profile,注意它们三个都是以点号开头,表示它们是隐藏文件,不会显示在普通的ls命令清单中。

交互式shell:

如果启动了一个bash  shell而没有登录系统,比如说只在cli提示符中键入bash,则我们启动的就是一个交互式shell,交互式shell与登录shell的行为不同,但是它仍然提供了一个cli提示符来供我们输入命令。

如果bash作为交互式shell启动,它不会处理/etc/profile文件,相反,它会检查用户HOME目录中的.bashrc文件。而.bashrc文件执行两个任务:①首先检查/etc目录中的公共bashrc文件。②为用户输入个人别名和私有脚本函数提供了地方。

而公共/etc/bashrc文件由系统上启动了交互式shell会话的任何人运行。默认文件将设置一些环境变量,但是它没有使用export命令将它们设置为全局性质。请记住,每次启动新交互式shell时都会运行交互式shell启动文件,因此,任何子shell都会自动执行交互式shell启动文件。其中我们也会注意到,/etc/bashrc文件也执行了位于/etc/profile.d目录中的、特定于应用程序的启动文件。

非交互式shell:

它是系统开始执行shell脚本的shell。它的不同之处在于不用担心cli提示符,但是我们仍然希望在每次启动系统中的脚本时运行特定的启动命令。

bash  shell提供了BASH_ENV环境变量,当shell开始一个非交互式shell进程时,它将检查该环境变量中表示的待执行启动文件的名称。如果该变量有值,则shell将执行该文件中的命令。

变量数组:

环境变量的一个非常好地特性就是能够当做数组使用,数组是能够保存多个值的变量,数组中的值既可以分别使用,也可以作为整体引用。

要为某个环境变量设置多个值,我们只需要将它们列出在圆括号中,各个值以空格分割,比如>xin=(one two  three  four  five) 不过当我们使用>echo  $xin的时候却只会显示数组的第一个值。

如果我们要引用某个单独的数组元素,我们必须使用一个数值索引值,它表示该元素在数组中的位置,索引值放在方括号中,比如:echo  ${xin[2]},这里需要注意的是,环境变量数组的索引值从0开始。当然我们也可以在中括号中使用星号通配符来查看所有值,比如echo  ${xin[*]}。

我们还可以更改某个索引位置的值,比如xin[2]=star,当然我们还可以使用unset来移除数组中的某个值,比如unset  xin[2],当然我们也可以用unset  xin来移除整个数组。

时间: 2024-08-25 12:30:59

辛星浅谈Linux中的环境变量的相关文章

辛星浅谈mysql中的元数据

首先解释一下什么是元数据,所谓元数据,就是表示数据的数据,这些数据五花八门,总之,只要不是我们存储到数据库里的数据,大多都可以理解为元数据.那么我们如何来获取这些元数据呢? 总的来说,有三种思路,第一种,各种show,第二种,各种select,第三种,是mysql的命令行下的命令,不是sql语句. 我们首先看第一种,这里我列举一下大家比较熟悉的show语句的用法,其实咱们经常用show来查看信息,比如: show databases; show tales; show create table

辛星浅谈mysql中的数据碎片以及引擎为MyISAM下的操作

对于mysql中的数据碎片,其实和我们删除数据是息息相关的,删除数据的时候必然会在数据文件中造成不连续的空白空间,对于少量的数据的删除,并不会产生多少的空白空间.如果在一段时间内的大量的删除操作,会使得这种留空的空间变得比存储列表内容所使用的空间更大.可能有人会说,我们向数据库中插入数据的时候,会不会在这些空白空间中插入数据呢?答案是会的.但是,它会造成一个后果,那就是数据的存储位置不连续,以及物理存储顺序与理论上的存储顺序不相同,这就比较麻烦了. 按照数据碎片的大小来分,可以分为单行数据碎片和

辛星浅谈Redis中的虚拟内存

和大多数NoSQL一样,Redis也是使用的KV的数据存储模型,为了提高读写效率,Redis也是将KV保存在内存中,但是这样做会带来一些问题. 如果 内存足够大,那么把所有的数据都加载到内存中固然是最好的选择,那么查询操作都直接操作内存,自然是很快.但是实际情况中却更多的是只有部分数据才能加载到内存中,那么这个时候就提出来一个虚拟内存的概念. Redis中的虚拟内存和Linux中的虚拟内存不是一回事,但是其思想是一致的,就是把暂时不常用的数据从内存交换到磁盘中,从而可以把宝贵的内存腾出来用于其他

辛星浅谈Redis中的事务

Redis也提供了对事务的支持,在Redis中,我们常用的命令就是multi.exec.discard.watch这四个命令.其中multi命令用于开始一个事务,该语句之后的所有命令都会被视为事务之内的操作,而exec是提交一个事务,discard是回滚一个事务. 下面是对一些命令的具体介绍: multi----用于标记事务的开始,其后执行的命令都被存放于命令队列,直到执行exec时,这些命令才会被原子的执行.它的返回值总是OK. exec----执行在一个事务内命令队列中的所有命令,同时将当前

浅谈Linux中的信号机制(二)

首先谢谢 @小尧弟 这位朋友对我昨天夜里写的一篇<浅谈Linux中的信号机制(一)>的指正,之前的题目我用的“浅析”一词,给人一种要剖析内核的感觉.本人自知功力不够,尚且不能对着Linux内核源码评头论足.以后的路还很长,我还是一步一个脚印的慢慢走着吧,Linux内核这座山,我才刚刚抵达山脚下. 好了,言归正传,我接着昨天写下去.如有错误还请各位看官指正,先此谢过. 上篇末尾,我们看到了这样的现象:send进程总共发送了500次SIGINT信号给rcv进程,但是实际过程中rcv只接受/处理了1

辛星浅谈PHP的混乱的编码风格

我们都知道,各种编程语言都有自己的风格,即使是像C和C++那样一脉相承的语言(C++本意完全兼容C的语法),编程风格上还是有些差别,比如很典型的就是C++风格的单行注释和C风格的多行注释. 而虽然Java在很大程度上借鉴了C的语法,但是不可否认,Java的经典的大括号是左大括号是在类名或者函数名等同一行的,而C++风格的则是大括号另起一行,可能有些Java程序员和C++程序员这两种风格都用,但是如果大家多看看大师的编码风格,会发现其实大括号另起一行是典型的C++的风格,大括号不另起一行是典型的J

浅谈linux中shell变量$#,[email&#160;protected],$0,$1,$2,$?的含义解释

浅谈linux中shell变量$#,[email protected],$0,$1,$2,$?的含义解释 下面小编就为大家带来一篇浅谈linux中shell变量$#,[email protected],$0,$1,$2的含义解释.小编觉得挺不错的,现在就分享给大家,也给大家做个参考.一起跟随小编过来看看吧 摘抄自:ABS_GUIDE 下载地址:http://www.tldp.org/LDP/abs/abs-guide.pdf linux中shell变量$#,[email protected],$

Java网络编程和NIO详解7:浅谈 Linux 中NIO Selector 的实现原理

Java网络编程和NIO详解7:浅谈 Linux 中NIO Selector 的实现原理 转自:https://www.jianshu.com/p/2b71ea919d49 本系列文章首发于我的个人博客:https://h2pl.github.io/ 欢迎阅览我的CSDN专栏:Java网络编程和NIO https://blog.csdn.net/column/details/21963.html 部分代码会放在我的的Github:https://github.com/h2pl/ 浅谈 Linux

Linux中的环境变量PATH

首先一点Linux中的每个命令其本质是一个可执行的文件,以ls命令为例.通过命令:$:whereis ls可以查看ls命令的位置在/bin/目录下.当用$:ls -l /bin/ls命令查看文件/bin/ls的属性时,得到如下结果: 其实我们在任意目录下执行的ls命令时,其实执行的是位于/bin目录下的ls文件.那么当在任意目录下执行各种命令时,是怎么找到各自的命令的呢?这就是PATH的作用.查看环境变量PATH的内容如下: PATH的作用就是,当输入命令的时候,Linux会去查找PATH里面记