一文理解linux环境变量(初学者之友)

我的戏份在文末,建议结合我们技能树以前出品的一文系列一起学习:

linux命令行文本操作一文就够

健明

继续见证学徒的成长!

对于Linux初学者来说,环境变量是个很陌生的名词,很多人不能理解它是到底是什么,可以用来干嘛。其实,环境变量,在windows中也有,只是我们平时不怎么直接接触它,所以我们下面也只针对Linux来讲环境变量。

什么是环境变量

首先,在百度百科中,环境变量的解释是这样的:

环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数,如:临时文件夹位置和系统文件夹位置等。
环境变量是在操作系统中一个具有特定名字的对象,它包含了一个或者多个应用程序所将使用到的信息。例如Windows和DOS操作系统中的path环境变量,当要求系统运行一个程序而没有告诉它程序所在的完整路径时,系统除了在当前目录下面寻找此程序外,还应到path中指定的路径去找。用户通过设置环境变量,来更好的运行进程。

描述性文字理解起来还是太抽象了,我们还是用几个简单的例子,来学习一下环境变量吧

首先,我们登陆上服务器,然后输入ls命令:

vip18 10:06:09 ~
$ ls
readme.txt

可以看到,在当前用户vip18的家目录~下,有一个文件叫readme.txt,但是,当前目录下面并没有ls命令所对应的可执行文件。真正的ls命令的可执行文件,其实是在别处,我们用which ls可以查看到ls所在的位置:

vip18 10:06:13 ~
$ which ls
/bin/ls

可以看到,ls其实是保存在/bin/ls这个目录下的。而我们之所以可以随时随地的调用ls,是因为当要求系统运行一个程序而没有告诉它程序所在的完整路径时,系统除了在当前目录下面寻找此程序外,还应到path中指定的路径去找。接下来我们看看当前的环境变量PATH是什么,用echo $PATH可以查看到

vip18 10:11:28 ~
$ echo $PATH
/trainee/vip18/bin:/trainee/vip18/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

可以看到,PATH记录的是很多个目录,这些目录以冒号:作分割,为了让大家看的清楚,我们把冒号:替换成\n

vip18 10:27:59 ~
$ echo $PATH|tr ':' '\n'
/trainee/vip18/bin
/trainee/vip18/.local/bin
/usr/local/sbin
/usr/local/bin
/usr/sbin
/usr/bin
/sbin
/bin
/usr/games
/usr/local/games
/snap/bin

其实,PATH就是记录了很多以bin或者sbin为结尾的目录,这些目录下面就包涵了很多可执行文件,比如我们上面提到的ls命令所在的目录/bin就是倒数第4个。感兴趣的可以去看看其他命令对应的可执行文件都记录在哪个目录里面,这里不再展示。

如何修改环境变量

修改环境变量,其实就是对环境变量进行重新赋值,比如我们安装了一个软件叫aspera

# 下载
wget -c https://download.asperasoft.com/download/sw/connect/3.8.1/ibm-aspera-connect-3.8.1.161274-linux-g2.12-64.tar.gz
# 解压
tar zxvf ibm-aspera-connect-3.8.1.161274-linux-g2.12-64.tar.gz
# 安装
bash ibm-aspera-connect-3.8.1.161274-linux-g2.12-64.sh

这个软件安装好了之后,会在用户的家目录下的生成一个隐藏目录.aspera,需要用ls -a来查看

进一步查看这个目录的结构:

发现它的下下层目录也有一个叫bin的目录,包涵的可执行文件有$ ls .aspera/connect/bin/
ascp  asperaconnect  asperaconnect.bin  asperacrypt  asunprotect

假如我们想像调用ls那样随时随地的调用这个软件的命令,即~/.aspera/connect/bin/目录中的可执行文件,那么就需要把这个路径添加到环境变量里面去,方法是:

export PATH="~/.aspera/connect/bin/:$PATH"
# 注意这里要用双引号,不能用单引号

运行上面这一行命令之后,就可以随时随地得调用了,如:

但是,这方法并不能一劳永逸,我们需要把它写进去.bashrc里面去

.bashrc文件

.bashrc是一个配置文件,也是一个隐藏文件,存在于用户的家目录~下,需要用ls -a才能查看到,当我们每次登陆服务器时,这个文件就会被执行一次,也就是说文件内的代码会被运行一遍。因此,当我们把export PATH="~/.aspera/connect/bin/:$PATH"这一行命令写入.bashrc后,以后每次登陆服务器,系统就会帮我们把这一行命令执行一次,我们就不能再自行运行了,方法如下:

echo export PATH="~/.aspera/connect/bin/:$PATH" >>.bashrc

这样我们就把这一行代码写入到.bashrc里面了,我们说过,.bashrc是在登录服务器的时候才会被执行,因此,我们修改好了之后,要重新登录服务器,或者重新运行一下.bashrc,方法如下:

source .bashrc

这里不建议新手采用vim来编辑.bashrc,除非你已经知道如何使用vim这个工具

一些其他软件,如conda,在安装的时候会有一句提示,问我们是否要把conda的环境添加到.bashrc如:

Do you wish the installer to prepend the Miniconda2 install location
to PATH in your /trainee/vip18/.bashrc ? [yes|no]
[no] >>> 

我们直接输入yes,这样conda的环境就自动添加到.bashrc里面了,不需要像上面那样自己添加。

补充一个错误的示例

有一些初学者,在修改环境变量的时候,不小心改成了这样:

echo export PATH="~/.aspera/connect/bin/:$ PATH" >>.bashrc

咋一看好像没什么问题,但其实这是个大问题,后面的$PATH之间按多了一个空格,重新激活.bashrc后,就会出现下面的现象:

上面的这些命令都用不了了,报错信息都写着:xxx is not included in the PATH environment variable
但是同时,报错信息也给出了非常重要的一点,如:Command 'ls' is available in '/bin/ls',也就是告诉你了ls命令的可执行文件所在的路径,那么,我们只需要采用全路径调用的方法即可使用这些命令了。

当然,我们最终的解决办法还是要把环境变量改回来,一个方法就是删掉最后一行,也就是我们前面追加的一行代码,如:

/bin/sed -i '$d' .bashrc

最后在重新登录服务器就ok了。

后记

修改PATH也许并不是一个好习惯

如果每次安装一个软件就添加其路径到环境变量,最后我们的PATH会变得非常臃肿,通常并不建议这种方式管理软件。

另外一个比较常见的方式是设置文件链接到PATH的其中一个路径,或者直接把可执行的文件拷贝过去。

再或者设置 alias也可以,相信技能树的粉丝高手众多,也许会有自己的软件管理技巧,欢迎留言分享自己的心得体会!

■   ■   ■

(0)

相关推荐

  • Linux 环境变量的所有知识

    今天详细聊聊环境变量吧.这个十分常见而基础的问题,想必经常困扰初学者,属于众多"我问了,人家也答了,我还看了帖子,但始终没搞明白"的问题之一.岛主试试用写科普的啰嗦风格解释一下.今 ...

  • linux bash变量作用域

    一,思考一个问题,当在shell里执行某个程序时,shell是怎么找到这个程序的? shell会去$PATH环境变量定义的目录里去找这个命令.环境变量里一般包括/usr/local/sbin:/usr ...

  • Linux 环境变量配置全攻略

    来自:悠悠i 链接:https://www.cnblogs.com/youyoui/p/10680329.html Linux环境变量配置 在自定义安装软件的时候,经常需要配置环境变量,下面列举出各种 ...

  • ubuntu环境变量的三种设置方法

    一:设置环境变量的三种方法 1.1 临时设置 export PATH=/usr/local/arm/3.4.1/bin:$PATH 1.2 当前用户的全局设置 打开~/.bashrc,添加行:expo ...

  • 科普文, linux环境下,逻辑卷管理LVM

    教育不是灌输知识,教育是养成能力的过程.把知识学习转化成技能获取,是养成教育的重要内容.本文基于<云计算平台的运维与开发>课程内容,解读LVM概念,以及LVM的相关应用技术. linux用 ...

  • shell环境变量有哪些知识?linux运维知识点

    环境变量一般是指用export内置命令导出的变量,用于定义Shell的运行环境,保证Shell命令的正确执行.Shell通过环境变量来确定登录用户名.命令路径.终端类型.登录目录等.Linux运维技能 ...

  • linux系统环境变量一文就够

    Linux是一个多用户的操作系统.每个用户登录系统后,都会有一个专用的运行环境. 通常每个用户默认的环境都是相同的,这个默认环境实际上就是一组环境变量的定义. 环境变量是全局的,设置好的环境变量可以被 ...

  • 理解Linux文档的默认安全机制、隐藏属性、特殊权限,妈妈在也不用担心你从删库到跑路!!!

    写在前面 前面的章节 详解Linux文档属性.拥有者.群组.权限.差异,介绍了文档的基本权限,包括读写执行(r,w,x),还有文档若干的属性,包括是否为目录(d).文件(-).链接文件(l).拥有者. ...

  • 一文理解 Python 中的变量

    " 变量让程序活起来,不再千人一面." 我们在之前的文章<Python 基本数据类型介绍>中了解了如何创建各种基本类型的数据,但是我们的例子中使用的都是"字面 ...

  • 【Linux 笔记】Linux 基本操作 - 01. 系统认知-文本处理-软件安装-环境变量

    【Linux 笔记】Linux 基本操作 - 01. 系统认知-文本处理-软件安装-环境变量

  • Linux中环境变量相关文件的区别

    Linux下各种不同环境变量相关文件的作用: 1. /etc/environment  设置整个系统的环境,系统启动时,该文件被执行. 2. /etc/profile     设置所有用户的环境,当用 ...