首页 > 其他分享 >环境变量那些事儿

环境变量那些事儿

时间:2022-10-07 23:05:36浏览次数:46  
标签:bin 变量 自定义 那些 HOME 事儿 环境变量 bash

一直以来,配置环境变量的时候都是管中窥豹,对于环境变量的配置似懂非懂。 现在就来认真补一补这方面的不足。

主要内容包括:

  • HOME
  • 为什么需要$,直接打印HOME不行吗?
  • 一个系统下只有一个HOME变量吗?
  • 如何override系统自定义的HOME变量?
  • 可以在bash中直接通过$HOME访问目录吗?
  • =左右有空格吗?
  • 如何设置重写的HOME永久有效?
  • PATH
  • macOS中如何让.bash_profile中的shell命令永久有效
  • 原来似曾相识的这些bin存放在这里
  • DIY Variable
  • 设置自定义变量
  • 读取自定义变量
  • shell间共享自定义变量
  • 查看所有的共享变量

先来思考这些问题:

  • java,node,go,python bash环境变量如何设置?
  • mysql,mongoDB bash环境变量如何设置?
  • flutter镜像加速环境变量PUB_HOSTED_URL,FLUTTER_STORAGE_BASE_URL如何配置?
  • bash variable和shell variable的区别是什么?

专项学习环境变量之前的理解:雾里看花 java,node,go,python这些命令在SDK安装过程中就会自动安装。 mysql,mongoDB bash环境变量需要手动添加到环境当中。 flutter shell 环境变量需要手动配置。 bash variable与shell variable最直观的区别在于:bash variable在bash terminal中访问;shell variable在shell文件中保存。

专项学习环境变量之后的理解:洞若观火 发现环境变量竟然包括以上如此多内容,最初的问题也可以一一找到答案。

接下来就来看看关于环境变量,到底有哪些需要掌握的知识点。

HOME

这是一个指向用户的home目录的bash var。 格式为​​/Users/<username>​​​或​​/var/root​​​(macOS)。linux系统上为​​/home/<username>​​。

// frank用户
echo $HOME // /Users/frank
// root用户
echo $HOME // /var/root

引申问题:

为什么需要$,直接打印HOME不行吗?

在bash中,只有加上$以后,系统才会知道我们要输出的是变量,否则会当做输出一个普通字符串处理。

一个系统下只有一个HOME变量吗?

取决于系统上有几个用户,有个用户就有几个HOME变量。 一般会有一个root用户和至少一个普通用户。

如何override系统自定义的HOME变量?

在~/.bash_profile中重写。(需要手动source才有效,当前session有效) 在bash session terminal中export HOME=/Users/frank/foo。(当前session有效) 关闭再打开或者新开一个tab,$HOME都会变为最原始的值。 不建议重写。具体原因看原因6。

可以在bash中直接通过$HOME访问目录吗?

可以。​​$HOME/tools // /Users/frank/tools​

=左右有空格吗?

没有。空格在shell中有特殊含义。

如何设置重写的HOME永久有效?

​/etc/profile //# System-wide .profile for sh(1)​​ 因为大量的程序依赖HOME这个环境变量,所以覆盖系统默认变量是很危险的。 所以一般仅在当前session有效,若想永久覆盖,可参考PATH的加粗部分。

PATH

这个系统变量,会列出可执行程序的目录。 java,node,go,python这些命令在SDK安装过程中就会自动安装的原因就是这个,sdk会自动添加路径到PATH变量中。

macOS中如何让.bash_profile中的shell命令永久有效

  • 可以通过​​mkdir $HOME/bin​​​新建自己的bin目录,并通过​​PATH=$PATH:$HOME/bin​​将自定义的bin目录加入到PATH变量。要写在.bashrc(linux),.bash_profile(macOS)中,用source .bashrc可以让文件立即生效。(亲测无卵用,.bash_profile仅在当前session生效,不过路径在.bash_profile中写是对的)
  • 若是想让.bash_profile真正生效,需要在terminal的偏好设置中设置,启动命令source ~/.bash_profile

原来似曾相识的这些bin存放在这里

// bin目录间用冒号分隔
echo $PATH // /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
  • /usr/local/bin 存放了brew,cnpm,docker,docsify,koa,mongo,mongod,node,npm,python3,yarn
  • /usr/bin 存放了cd,git,java全家桶,man,python2,ssh,su,sudo,touch,unzip,vi,vim
  • /bin 存放了mv,rmdir,cat,ln,ls,kill,pwd,echo,mkdir,rm
  • /usr/sbin 没有一个常用的
  • /sbin ifconfig

DIY Variable

➜  ~ foo=123
➜ ~ echo $foo
123
➜ ~ bash
bash-3.2$ echo $foo

这个例子中的bash命令,会开启一个daughter process,在mother process中设定的自定义变量是无法访问的。

为什么/usr/bin中会有java全家桶的bin呢?

难道java全家桶的命令不是存放在/Library/Java/JavaVirtualMachines/jdk-11.0.3.jdk/Contents/Home/bin吗?为什么/usr/bin中也有。

通过​​ls -l /usr/bin | grep java​​可以查实原因。

lrwxr-xr-x   1 root   wheel         74  5  4 17:12 java -> /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands/java
lrwxr-xr-x 1 root wheel 75 5 4 17:12 javac -> /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands/javac
lrwxr-xr-x 1 root wheel 77 5 4 17:12 javadoc -> /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands/javadoc
lrwxr-xr-x 1 root wheel 75 5 4 17:12 javah -> /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands/javah
lrwxr-xr-x 1 root wheel 75 5 4 17:12 javap -> /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands/javap
lrwxr-xr-x 1 root wheel 82 5 4 17:12 javapackager -> /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands/javapackager
lrwxr-xr-x 1 root wheel 76 5 4 17:12 javaws -> /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands/javaws

soft link。 /usr/bin中的java全家桶命令只是/Library/Java/JavaVirtualMachines/jdk-11.0.3.jdk/Contents/Home/bin部分bin文件的soft link。

如果不懂soft link,可以移步​​[译]Soft and Hard links in Unxi/Linux​

设置自定义变量

​new_variable="Hello"​

读取自定义变量

​echo $new_variable​

shell间共享自定义变量

如何在bash daughter process中也能访问到自定义变量呢,也就是如何在进程间共享自定义变量呢?

➜  ~ export bar=456
➜ ~ bash
bash-3.2$ echo $bar

从这个例子中可以看到,export就是干这个事情的。(es6中的export和这个也很类似,只有export的内容,其他模块才能获得数据。) 注意:在daughter process修改继承来的变量值,mother process不会被修改。(这个和编程语言中的继承很像。)

查看所有的共享变量

export -p
...
export USER=frank
export OLDPWD=/
export ZSH=/Users/frank/.oh-my-zsh
export bar=456

OLDPWD这个变量指的就是最近一次访问的目录,通过​​cd -​​​访问到的其实就是这个目录。 同样,通过​​​env​​​也可以直接获得所有的环境变量列表,不同的地方在于不带export并且是环境变量的最终结果,​​export -p​​会显示变量的详细配置(因为它有可能依赖其他环境变量)。

反思与总结

  • 主要深入了解了HOME,PATH和DIY环境变量是什么
  • 对似曾相识的bin,.bash_profile, export等等有了较为清晰的认知
  • 主要根据参考资料​​bash-variables-environmental-and-otherwise​​做了一些在macOS环境下的一些思考和实践
  • 没有涉及语言层面的环境变量,例如NODE_ENV,process.env等等,但是如果掌握了上面提到的内容,对这些语言环境变量的理解也会更加轻松
  • 微信公众号: 大大大前端

标签:bin,变量,自定义,那些,HOME,事儿,环境变量,bash
From: https://blog.51cto.com/u_15725382/5735193

相关文章

  • 读博那些事儿
    读博那些事儿来源:​​https://zhuanlan.zhihu.com/p/82579410​​0.背景在圡博里我算是比较成功的了(CCF优博和ACMChina优博提名,两项都是Top5),写这篇文章一方面防止......
  • JDK安装及环境变量配置--流程
    jdk安装与配置环境变量1、下载jdkJDK1.8官网链接地址https://www.oracle.com/java/t...点击下载,下载完后安装,直接点击下一步。可更改你要安装的位置(要记住这个位置,后面环......
  • 今天重新学习java基础的时候遇到了一个好玩的问题。换了环境变量jdk还是显示原来版本
    今天学习ES,需要用到更高版本的jdk(我以前用的是1.8),所以要更改以前的jdk设置,总体步骤如下:1.下载jdk-11,解压2.打开环境变量配置,把以前配置的JAVA_HOME的改为新jdk-11的路径......
  • Python学习(三)win7 下添加python环境变量
    我的电脑--属性--高级系统设置;环境变量--新建,变量名:“PYTHONHOME”,变量值:python的安装路径;找到Path--编辑,在变量值的最后边添加“;%PYTHONHOME%;%PYTHONHOME%\Scrip......
  • python安装及环境变量配置
    python环境变量配置1、双击安装包,出现如下的安装界面,选择自定义安装2、选项设置,默认全部勾选即可3、高级配置选线,如图勾选即可4、如下图所示,安装过程中5、......
  • 【linux】查看环境变量|getenv & setenv设置获取环境变量getenv & setenv 获取&设置环
    目录​​环境变量类型​​​​查看环境变量​​​​系统的环境变量​​​​进程的环境变量​​​​初始化时载入的环境变量​​​​执行过程中设置的环境变量​​​​环境变......
  • bug的生命周期都有那些阶段
    bug的生命周期都有那些阶段​​一、主要有八个生命周期阶段​​​​二、bug生命周期流程图​​一、主要有八个生命周期阶段  1)New:是新发现的bug(指给对应的开发);  2)Open......
  • 产品经理必懂得技术那点事儿——读书笔记
    产品经理必懂得技术那点事儿1.产品思维与技术思维1.1.产品经理为什么要懂技术当产品经理与工程师就某一个具体问题进行讨论时,双方站在各自角度就问题进行分析和讨论,固有......
  • jmeter之安装以及环境变量配置
        配置环境变量  %JMETER_HOME%\lib\ext\ApacheJMeter_core.jar%JMETER_HOME%\lib\jorphan.jarD:\work\jmeter\apache-jmeter-5.0jmeter5.0没找到第三个......
  • 模具从设计到试模,不能忽视那些环节!
    01绘制模具图要求按照国家制图标准绘制,但是也要求结合本厂标准和国家未规定的工厂习惯画法。在画模具总装图之前,应绘制工序图,并要符合制件图和工艺资料的要求。由下道工序保......