很多程序和脚本都通过环境变量来获取系统信息、存储临时数据和配置信息。

6.1 什么是环境变量:

bash shell用一个叫环境变量(environment variable)的特性来存储有关shell会话和工作环境的信息。

这项特性允许在内存中存储数据,以便程序能轻松访问到它们。

在bash shell中,分两类:

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

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

6.1.1全局环境变量

查看全局变量,  $env    $printenv

查看某个全局变量:$printenv HOME  或者

$echo $PATH   // $后面接变量名。能让变量作为命令行参数

比如:ls  $HOME   相当于 ls  /home/xiaochongyong

6.1.2 局部环境变量

只在定义它们的进程中可见。

可分为:标准的局部变量  和 用户自定义的局部变量

set:显示为某个特定进程设置的所有环境变量(包括全局,标准局部,自定义局部),还会按照字母排序。

6.2 设置自定义变量。大小写敏感的

6.2.1 设置局部自定义变量:尽量用小写

$my_variable=hello

$echo $ my_variable

$my_variable="hello xcy"   // 两个词时这么写,加"" 。=边上还不能有空格

$echo $ my_variable

父shell中写了,子shell不一定能用。反之也是。

6.2.1 设置全局环境变量。

设定全局变量的进程所创建的子进程中,该变量都是可见的。

创建方法:

(1)

$my_variable=hello  // 创建环境变量

$export my_variable  // 导出到全局变量中

(2)export $my_variable=new_hello   // 这样是更改值

子shell无法改到父shell中全局变量的值。只在当前子shell有效。

6.3删除环境变量

$unset my_variable

子shell中删除了,无法反应到父shell中去。

6.4 默认的shell环境变量。

默认情况下,bash shell中会用一些特定的环境变量来定义系统环境。

这些变量在Linux系统上都已经设置好了。

6.5 设置PATH环境变量

PATH:定义了用于进行命令和程序查找的目录。

echo $PATH   目录以冒号隔开。

可以把新的搜索目录添加到现有的PATH环境变量中。比如:

gcc hello.c -o xcy

一般只能 ./xcy   运行

但是加了环境变量之后就可以运行了。

但是切换到别的目录还是不行。除非这么加

对PATH的修改只能持续到退出或重启系统,不能一直持续。

6.6 定位系统环境变量

登入系统启动一个bash shell时,默认情况下bash会在几个文件中查找命令。这种文件叫做启动文件或环境文件。

bash检查的启动文件取决于启动bash shell 的方式。启动方式有三种:

1.登录shell:登录系统时,bash shell会作为登录shell启动。会从5个启动文件里面读取命令。

(1)/etc/profile  (系统默认主启动文件,系统上每个用户登录都会执行这个启动文件)

(2)HOME/.bash_profile  HOME/.bashrc  HOME/.bash_login  HOME/.profile

这4个是针对用户的,提供一个用户专属的启动文件来定义该用户所用到的环境变量。

大多数Linux发行版只用到这四个文件中的一两个。不一定每个用户都有所有文件。

shell、按照下面的顺序运行第一个被找到的文件,余下的被忽略:

HOME/.bash_profile

HOME/.bash_login

HOME/.profile

注意上面没有HOME/.bashrc  。

HOME/.bashrc  这个文件通常通过其他文件运行。

我的电脑里面只有 HOME/.profile

红色部分表示检查HOME目录是不是有一个.bashrc,如果有就会先执行.bashrc里面的命令

2.交互式shell进程

不是系统登录时启动的,比如在终端下直接运行bash。这个就是交互式shell进程。

这种进程不会访问/etc/profile,只会检查HOME下的.bashrc

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

3.非交互式shell

系统执行shell脚本时用的就是这种shell。

没有命令行提示符。

bash shell提供BASH_ENV环境变量。当启动非交互式shell时,会检查BASH_ENV来查看要执行的启动文件。如果有,shell会执行里面的命令。这通常包含shell脚本变量设置。

我的电脑没有BASH_ENV值。是如何处理的呢?通过继承父shell的导出过的变量。

比如:父shell是登录shell。在/etc/profile  /etc/profile.d/*.sh  HOME/.bashrc  文件中设置并导出了环境变量,用于执行脚本的子shell能继承这些变量。、

父shell未导出的变量是局部变量,子shell无法继承。

6.6.4 环境变量持久化

对于全局环境变量,/etc/profile 在升级之后就会没有。可以在/etc/profile.d 目录下创建一个.sh结尾的文件,把所有新的或修改过的全局变量放在这个文件中

存储个人永久性bash shell的地方是HOME/.bashrc。

比如之前的给命令取别名,如果放在这里就可以永远使用了。

6.7 数组变量。

环境变量可以是数组(从0开始)。比如:

这个用的很少。

《Linux命令行与shell脚本编程大全》 第六章环境变量的更多相关文章

  1. 《Linux命令行与shell脚本编程大全》23章24章

    第二十三章 使用其他shell bash shell是linux发行版中最广泛使用的shell.但是它并不是唯一的选择,还有其他的shell可以供你选择. 23.1 什么是dash shell 百度百 ...

  2. 《Linux命令行与shell脚本编程大全》第九章 安装软件程序

    包管理系统(PMS):用来进行软件安装.管理和删除的命令行工具 9.1包管理基础 1.主流的Linux发行版都采用了某种形式的包管理系统来控制软件和库的安装 2.PMS用一个数据库来记录:系统上安装了 ...

  3. Linux命令行与shell脚本编程大全.第3版(文字版) 超清文字-非扫描版 [免积分、免登录]

    此处免费下载,无需账号,无需登录,无需积分.收集自互联网,侵权通知删除. 点击下载:Linux命令行与shell脚本编程大全.第3版 (大小:约22M)

  4. 《Linux命令行与shell脚本编程大全 第3版》创建实用的脚本---11

    以下为阅读<Linux命令行与shell脚本编程大全 第3版>的读书笔记,为了方便记录,特地与书的内容保持同步,特意做成一节一次随笔,特记录如下:

  5. 《Linux命令行与shell脚本编程大全 第3版》高级Shell脚本编程---47

    以下为阅读<Linux命令行与shell脚本编程大全 第3版>的读书笔记,为了方便记录,特地与书的内容保持同步,特意做成一节一次随笔,特记录如下:

  6. 《Linux命令行与shell脚本编程大全 第3版》Shell脚本编程基础---57

    以下为阅读<Linux命令行与shell脚本编程大全 第3版>的读书笔记,为了方便记录,特地与书的内容保持同步,特意做成一节一次随笔,特记录如下:

  7. 《Linux命令行与shell脚本编程大全 第3版》Linux命令行---57

    以下为阅读<Linux命令行与shell脚本编程大全 第3版>的读书笔记,为了方便记录,特地与书的内容保持同步,特意做成一节一次随笔,特记录如下:

  8. 《Linux命令行与shell脚本编程大全 第3版》Linux命令行---56

    以下为阅读<Linux命令行与shell脚本编程大全 第3版>的读书笔记,为了方便记录,特地与书的内容保持同步,特意做成一节一次随笔,特记录如下:

  9. 《Linux命令行与shell脚本编程大全 第3版》Linux命令行---55

    以下为阅读<Linux命令行与shell脚本编程大全 第3版>的读书笔记,为了方便记录,特地与书的内容保持同步,特意做成一节一次随笔,特记录如下:

  10. 《Linux命令行与shell脚本编程大全 第3版》Linux命令行---54

    以下为阅读<Linux命令行与shell脚本编程大全 第3版>的读书笔记,为了方便记录,特地与书的内容保持同步,特意做成一节一次随笔,特记录如下:

随机推荐

  1. SiganlR 系列之概述

    简介 SignalR 是微软的 http 长连接(以下简称长连接)框架,它的出现为我们提供了一套行之有效的实时通信的解决方案. 背景 在http 1.0 时代,preRequest 都会建立新的tcp ...

  2. 征服 Redis

    大约一年多前,公司同事开始使用Redis,不清楚是配置,还是版本的问题,当时的Redis经常在使用一段时间后,连接爆满且不释放.印象中,Redis 2.4.8以下的版本由于设计上的主从库同步问题,就会 ...

  3. 最长上升子序列 LIS(Longest Increasing Subsequence)

    引出: 问题描述:给出一个序列a1,a2,a3,a4,a5,a6,a7….an,求它的一个子序列(设为s1,s2,…sn),使得这个子序列满足这样的性质,s1<s2<s3<…< ...

  4. linux备份文件脚本

    #!/bin/sh #Author: Opal TODAY=`date +%Y%m%d` YESTERDAY=`date -d"-1 day" +%Y%m%d` mkdir -p ...

  5. c#字符编码,System.Text.Encoding类,字符编码大全:如Unicode编码、GB18030、UTF-8,UTF-7,GB2312,ASCII,UTF32,Big5

    本页列出来目前window下所有支持的字符编码  ---c#通过 System.Text.Encoding.GetEncodings()获取,里面可以对其进行查询,筛选,对同一个字符,在不同编码进行查 ...

  6. 吾八哥学Python(一):搭建Python开发环境(Windows)

    学习Python的第一步当然是要配置一下开发环境了,这里记录一下本人在windows 10(64位)下配置Python开发环境的过程,供跟我一样的新手参考一下. 一.下载Python安装包 目前最新的 ...

  7. win10 uwp 弹起键盘不隐藏界面元素

    本文主要讲,在我们使用手机输入的时候,会因为手机的虚拟键盘隐藏了一些界面的元素.我们有一个简单的方法让虚拟键盘不隐藏界面元素. 我们需要的界面元素是在显示了虚拟键盘后的空间能全部显示,如果不能的话,还 ...

  8. php的序列化和反序列化有什么好处?

    序列化是将变量转换为可保存或传输的字符串的过程:反序列化就是在适当的时候把这个字符串再转化成原来的变量使用.这两个过程结合起来,可以轻松地存储和传输数据,使程序更具维护性. PHP 中的序列化和反序列 ...

  9. spring 学习笔记1

    Spring 学习记录 任何一个成功的应用都是由多个为了实现某一个业务目标而相互协作的组件构成的.这些组件必须彼此了解,并相互协作来完成工作. 在Spring 中,对象无需自己负责查找或创建与其关联的 ...

  10. python 使用标准库根据进程名获取进程的pid

    有时候需要获取进程的pid,但又无法使用第三方库的时候. 方法适用linux平台. 方法1 使用subprocess 的check_output函数执行pidof命令 from subprocess ...