想要更好的阅读体验,可以转我的个人博客: nonlinearthink

我们日常做开发的时候,经常遇到环境变量的配置,网上的教程往往总是教你做,却不告诉你为什么

那么环境变量到底是个什么东西?

环境变量

打印环境变量

什么是环境变量?

env

这个命令可以打印出所有的环境变量。

环境变量就是程序运行的一系列环境参数。

打印单个环境变量

echo $PATH
echo $SHELL
echo $HOME
echo $LOGNAME

这是几个比较常见的环境变量。

变量名 说明
PATH shell将会去这里搜寻命令和程序
SHELL 当前使用的shell类型
HOME 当前用户的根目录
LOGNAME 当前用户的登录名

定义环境变量

这是 Go 语言的一个环境变量配置。~/.bashrc 中添加下面几行。

export GOROOT=/usr/local/Cellar/go/1.13.5/bin

保存退出后,就可以使用 echo $GOROOT 打印出来了。

更改环境变量的值

有一个比较特殊的环境变量 $PATH,它的特殊性在于它事实上的意思是可执行文件的一个路径集合,既然是集合就可以被不断添加。

$PATH: 分割,大概就是 path/to/first:path/to/second 这样的形式。

export PATH=$PATH:$GOROOT/bin

上面的命令干了什么呢?

其实,他是做了一个 += 操作。也就是在原先的 $PATH 的基础上加上了 $GOROOT/bin

$GOROOT 就是上面定义的。


Shell 配置文件

多用户配置

在 unix-like 系统中,系统配置文件都被放在一个叫 /etc 的目录下。我们今天的主角是其中的 shell 配置文件。

shell 配置文件可以分为两类: *profile*shrc

*profile 中的内容会在用户登录时被运行。

*shrc 会在 shell 启动时被运行。

从生命周期的角度讲,写在 *profile 中的环境变量的生命周期是整个系统运行期间,而 *shrc 仅仅在 shell 被启动的时候才有效。

生命周期长不一定好,因为我们可能不希望操作系统做太多的初始化而导致开机变慢,所以大部分我们用户自定义的环境变量都是在 *shrc 中。

但是有些软件,需要他们一开机就运行,比如输入法,就需要写在 *profile 中。

cd /etc
ls *profile
# output:
# profile zprofile
ls *shrc
# output:
# bashrc csh.cshrc zshrc

因为我安装了 zsh,所以多了 zprofilezshrc,没安装过其他的 shell,只有默认的 bash 的话,应该只有 profilebashrc

除此之外,忘记说了一点,/etc 文件夹下的配置是针对全部操作系统的用户的。

单用户配置

上面说了多用户的环境变量配置,单用户的配置应该使用.bashrc.bash_profile,它们在用户的根目录(~)下,默认是不创建的,如果需要则自己创建。

cd ~
ls .*profile
# output:
# .bash_profile
ls .*shrc
# output:
# .zshrc

我这里给 bash 创建了 profile,而给 zsh 创建了 shrc,其他没创建。

值得注意的是,.bash_profile 在默认状态下,还会执行 .bashrc


环境变量的优先级

如果在 etc/profile 中和 ~/.bash_profile 都定义了相同的名字的环境变量,会发生什么?

这是一个有趣的问题,我们可以从配置文件被加载的顺序来考虑。

以 bash 为例。

  • 操作系统启动的时候,/etc/profile 被调用,然后 /etc/profile 调用 /etc/bashrc
  • 用户启动 shell 的时候,~/.bash_profile 被调用,然后 ~/.bash_profile 调用 ~/.bashrc

最后被调用的自然会覆盖前面被调用的。

那么这个问题的也就明确了。


补充

export 命令

export 命令就是设置环境变量。分两个场景来看:

  • 在命令行下

    在命令行下的 export 的作用域只有在这次登录期间。

    也就是说 shell 一旦退出,设置的环境变量就消失了。

    如果想要它一直存在,就要写到配置文件中。

  • 在配置文件中

    如果仔细看过上面的分析,就会知道配置文件是在 shell 登录时候自动加载的。

    自然就不会消失了。

source 命令

配置文件写入之后,环境变量不会马上更新。

source 命令可以加载一次配置文件的内容。

比如,配置完上面的内容,使用 source

source .zshrc

alias 命令

alias 就是别名,也就是为命令创建一个别名。

比如,在 linux 中,python 往往默认是 python2

使用 alias 可以设置成 python3

alias python=python3

alias 也可以当成 export 用。

区别在于,export 可以直接导入一个文件夹下面的全部可执行文件。

使用 alias 的还,你可能需要一个个精准定位了。

alias mysql=/usr/local/mysql/bin/mysql

这样之后,我们每次用 mysql 的命令,就会被替换成 /usr/local/mysql/bin/mysql

alias 略微简洁明了一点,但其实优势并不是很大,一般都推荐用 export

Linux 环境变量的那些事相关推荐

  1. shell编程(三) : [Linux基础] Linux 环境变量

    接上一篇文章Linux shell编程(二): Linux shell基础 2.3 Linux环境变量 bash shell用一个叫作环境变量(environment variable)的特性来存储有 ...

  2. Linux环境变量说明与配置

    相关的配置文件说明: /etc/profile 范围:对所有用户生效 作用: a.定义USER变量 b.定义LOGNAME变量 c.定义MAIL变量 d.定义PATH变量 e.定义HOSTNAME变量 ...

  3. linux mv 环境变量,linux环境变量,cp,mv命令,more,less,cat,tail,head,的使用...

    linux环境变量,cp,mv命令,more,less,cat,tail,head,的使用 [email protected] ~]# cp /usr/bin/ls   /tmp/ [[email p ...

  4. 超详干货!Linux 环境变量配置全攻略

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自|机器学习实验室 Linux环境变量配置 在自定义安装软件 ...

  5. python脚本设置linux环境变量_Linux环境变量export方法与修改文件方法的区别

    玩蛇网推荐图文教程:python 列表 要想修改Linux环境变量有两种方法可以实现,但是关于Linux环境变量export方法与修改文件方法的区别你又了解多少呢?设置 Linux 环境变量可以通过 ...

  6. Linux环境变量加载的研究

    我们经常遇到在linux执行某条命令时出现xxx文件没找到的问题.很多情况都不是库没有安装,而是环境变量的错误. 但是,我明明是设置了环境变量啊.所以,我对此进行了试验. 我们登录linux有很多种, ...

  7. Linux环境变量配置出错,导致登录不了......

    Linux环境变量配置出错导致的后果: 1.登陆不了 linux 了 2.基本命令全失效了(如:ls,vi,sudo,su,find,cp等),除了cd命令可用. 解决方法有如下三步: 1.从图形登陆 ...

  8. Linux环境变量配置

    这篇文章主要介绍了Linux环境变量配置全攻略,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧. 在自定义安装软件的时候,经常需要 ...

  9. linux环境变量配置的方法,Linux环境变量配置方法

    Linux上环境变量配置分为设置永久变量和临时变量两种.环境变量设置方法同时要考虑环境Shell类型,不同类型的SHELL设置临时变量方法和设置永久变量对应的配置文件不同.Linux环境变量本身配置过 ...

最新文章

  1. 出租司机给我上的MBA课 -- [ 来自: ] [作者:cexo255]
  2. Android实现蝴蝶动画,蝴蝶飞舞- (补间动画+逐帧动画)
  3. npm命令运行时报错_运行npm update等命令出错后如何分析问题根源(示例代码)
  4. 一个简单51c语言程序,求一个 89C51 简易计算器的c语言程序 只要加减乘除就行!...
  5. Ngnix中的fastcgi参数性能优化和解释
  6. mentohust找不到服务器,mentohust最新版
  7. Python3-word文档操作(六):word文档中表格的操作-单元格文字居中,字体颜色等的设置
  8. 我的世界Minecraft Java开服教程(Windows)开服器开服包下载开服网站服务器开服核心开服端开服软件mac版Java启动器资源包
  9. 红米note4手机怎么屏幕录制视频
  10. 【项目实例】使用C#开发纽曼USB来电通来电弹屏客户端小结
  11. 批处理文件(bat)装逼 之全彩滚动我爱你 绘制五彩爱心 绘制3D球体
  12. tcp和udp的基本函数调用过程及如何选择
  13. 键盘定位板图纸_客制化键盘
  14. 计算机类sci查重,SCI科研写作:国自然标书查重方法
  15. 如何批量检测查询域名或者网址是否被微信屏蔽拦截
  16. GPS导航(4):SIM908模块
  17. Facebook广告投放:WC广告的优点和缺点
  18. 英音与美音的区别【转】
  19. 前端面试官问Promise,怎样回答拿高分
  20. return true return false 的区别

热门文章

  1. [安洵杯 2019]Attack (详细解析)
  2. android 仿简书评论,Android 开发仿简书登录框可删除内容或显示密码框的内容
  3. android app防止锁屏_如何控制Android不锁屏
  4. 使用STC-ISP向KEIL添加STC芯片头文件
  5. 数据中心管理与运维的问题与对策
  6. 图像超分——SISR方法总结(阅读整理之一)(优缺点,方法详情长更)
  7. 穿过时光隧道去看TNF100十周年,这次天猫Club如何跑出新生活方式?
  8. Vue Dhtmlxgantt甘特图/横道图 baselines 含(计划、实际时间对比)树形实例实现及部分扩展
  9. JS无限滚动、回到顶端和图片懒加载
  10. 带领域变异的多模态优化差分进化算法(DE/NCDE/NSDE/)