环境变量
环境变量,简单来说就是描述程序执行环境的一组变量。
1、什么程序执行环境?
环境已经基础词汇呢,我们通常都用环境去解释别的词,想一下,日常生活怎么用环境。你到一个新地方,我问你环境怎么样?你会回答我,天气怎么样,温度怎么样,等,那么你可以告诉我,在一个新地方,我问你环境怎么样,你依然告诉我,天气怎么样,温度怎么样。可以看出来天气和温度是两个变量,天气=优,温度=适中,就描述了一种幻觉,天气=差,温度=高,又描述了另一种环境。回想计算机环境变量是否也以这种形式出现呢?最常见的环境变量PATH=“”,该变量的作用是你在命令行工具输入一个命令默认搜索路径,你装完python,在命令行输入python不配置环境的话就会出现command not found,那么你可以将python解释器,移动到PATH后面对应的目录,或者将python的现有的路径添加到PATH后面,例如
PATH=$PATH:python对应的路径
如果直接写PATH=python对应的路径,他会覆盖掉以前的值,此时你执行其他命令时,他会报错,因为现在默认的搜索路径是你的python路径,里面是没有那些命令的。$后面加变量意思是取他的值的意思,意思就是把原本的PATH的值取了在续上你新加的。
Linux env命令可以列出所有环境变量,每个变量都他的作用慢慢介绍。
sunwei@sunweideMacBook-Pro ~ % env __CFBundleIdentifier=com.apple.Terminal TMPDIR=/var/folders/sd/wf3y8tsn0d7c8l9vkvk7bt_h0000gn/T/ XPC_FLAGS=0x0 TERM=xterm-256color SSH_AUTH_SOCK=/private/tmp/com.apple.launchd.EckTgDvpAA/Listeners XPC_SERVICE_NAME=0 TERM_PROGRAM=Apple_Terminal TERM_PROGRAM_VERSION=445 TERM_SESSION_ID=CDA5986B-000C-48A3-BBD0-D708523A6094 SHELL=/bin/zsh HOME=/Users/sunwei LOGNAME=sunwei USER=sunwei PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin SHLVL=1 PWD=/Users/sunwei OLDPWD=/Users/sunwei LANG=zh_CN.UTF-8 _=/usr/bin/env
2、什么是命令?
相信上面的介绍会让你似懂非懂,接下来详细介绍什么是命令,当你理解了什么命令后,你会对环境命令有更深刻的认识,命令其实就是一个可执行程序,Linux可执行程序基本是以ELF结构存储。你写的一个c编译后生成的a.out也可以是命令,执行的时候是不是./a.out, ‘.’在Linux系统代表是当前路径,意思就是当前路径搜索a.out,就执行了,想想上面介绍的PATH变量是干嘛的,如果我想直接输入a.out就能执行,应该怎么做?(聪明的你应该能想到,文末揭晓)。下面介绍一个命令是怎么运行起来的。
操作系统是一个大的可执行程序,开机以后操作系统(操作系统启动也有很多细节)就开始运行了,图形化操作系统启动后,运行的第一个程序就是桌面程序,非图形化操作系统第一个启动的程序就是命令行工具,命令行工具有很多,可以根据自己的喜好配置,常见的会启动一个bash,bash也是一个程序,那么上面提到,程序运行就会有环境变量控制他的环境,他的环境变量被存储在~/.bash_profile文件中,bash启动时就会读取里面的配置设置环境变量,启动完毕后,就一直在执行bash程序,等到你的输入,当你输入一个命令时,他会去PATH路径下搜索该命令,此时如果你输入的不是命令,直接输入PATH=‘’,或者更改其他环境变量。或许你听过这样的话,每个进程都有自己的独立的运行环境,当你输入一个命令时,是一个可执行程序,应该是启动了一个新的进程,怎么会影响你后续执行的程序呢?因为bash开始运行,他一直在等待你的输入,你输入的命令启动程序创建的进程都是bash的子进程,创建进程系统调用是fork,叉子的意思,他会把父进程完完全全复制一份,包括执行时环境,因此你设置新值后,后续启动的程序环境都被改变了。但是当你关闭bash再次启动你刚才改的就恢复,如果想永久有效,更改.bash_profile文件即可。