一文理解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也可以,相信技能树的粉丝高手众多,也许会有自己的软件管理技巧,欢迎留言分享自己的心得体会!

本文分享自微信公众号 - 生信技能树(biotrainee)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-06-30

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券