Linux 环境变量的所有知识
今天详细聊聊环境变量吧。这个十分常见而基础的问题,想必经常困扰初学者,属于众多“我问了,人家也答了,我还看了帖子,但始终没搞明白”的问题之一。岛主试试用写科普的啰嗦风格解释一下。今天还会出现export/ln/alias等指令,不展开,想必大家也知道岛主想说啥了。
. Q55:常听说装完软件要添加环境变量,到底是什么意思?
有时你明明安装成功了某个软件,却无法启动。输入指令后提示“command not found”。
这时,先排除拼写错误,大小写混淆等。
如果拼写和安装本身没有问题,最有可能是命令的执行文件不在系统默认的搜索路径中,系统搜了一圈没找到它。
系统的环境变量是一个内置的参数:PATH。还记得前两天讲过用echo
可以查看变量吗?无论是自己定义的变量,还是这种内置变量,都可以用echo
来查看:echo $变量名
所以,查看当前系统环境变量PATH
就是:
echo $PATH/usr/local/sbin:/usr/bin:/Users/ialbert/bin:/home/ubuntu/miniconda3/bin
每个人的系统设置不同,显示结果可能不太一样。
乍一看,长长一串很让人头晕。但仔细看一下,会发现:
我们可以用which
指令查看某命令当前的位置,如:
$ which samtools/usr/bin/samtools
$ which nanopolish/home/ubuntu/miniconda3/bin/nanopolish
你会发现,能正常使用的指令,其路径在PATH变量里都有迹可循。如果都找不到,系统就会报错。前几天介绍的生信分析必备的软件管理系统conda(我们装的是其精简版miniconda3),就能有效避免这种问题。
你是否还记得,最初安装miniconda的时候,中途会问你:
Installation finishedDo you wish the installer to initialize the Miniconda3in your home/user/.bashrc? [yes|no]
[no]>>> # 新手一般此处输入yes
回答yes,就是允许conda自动帮你配置环境变量。于是它会在PATH变量中添加一个属于它的目录,如/home/ubuntu/miniconda3/bin/
。此后,用conda install
安装的软件,其执行文件就会自动收在这个目录下,那自然也就包含在PATH变量里了,使用起来通常没啥问题。
但conda并没有收录所有的软件。有些很新、或不能用conda安装的软件,就需要手动安装。而如果启动文件的位置比较特立独行,不在PATH已有的范围里,这时你就需要手动帮它归队了。
. Q56:如何手动添加呢?
当然是修改PATH变量啦,把那个软件所在的目录用冒号:目录路径
追加进PATH里就好了。
这种修改分两种,临时和永久。
临时,顾名思义,仅限当前有效,重启Linux系统后就没用了。永久添加,就是彻底写进系统的脚本文件里。如home目录下的~/.bashrc
文件,其中记录了对当前用户有效的各种系统默认设置,每次启动Linux系统,这些设置都会自动生效。
临时修改:
用到export
命令。用法:
export 变量名=变量值
我们需要在PATH那一长串后追加新目录,写在冒号后就行了:原PATH
:
追加目录
。假设你要追加的目录是 /your_free_style_path/ (瞎编的):
export PATH="$PATH:/your_free_style_path/"
切记,这里原PATH的内容($PATH)要保留,冒号后再追加新内容,否则其他软件都不能用了。
有些帖子里的顺序可能是追加目录:$PATH
,$PATH变量放在了后面。这其实无所谓,只是系统搜索时的先后顺序不同,追加在前面就先搜索前面的。
如果你在不同目录下装了同一款软件(比如不同版本),启动命令相同,那么按照PATH里的目录顺序,先搜到谁就用谁。除非你对另一个重命名以作区分。
永久修改 方法1 (进入bashrc文件里修改)
就要把刚刚的改动正式写进系统脚本里。
# 打开 ~/.bashrc的编辑模式vim ~/.bashrc
# 找到 PATH 变量的内容,手动把`:/your_free_style_path/`写进去。
# 退出vim,要激活修改才能生效。source ~/.bashrc
永久修改 方法2 (不用vim编辑器,直接修改)
记得用>>
echo export PATH="$PATH:/your_free_style_path/" >> ~/.bashrc
. Q57:除了改PATH还能怎么做?
受修改变量的启发,还有一个非常有用的重命名指令alias
,用惯了简直爱不释手。基本用法是:alias 别名='原命令 -参数'
比如说,你要用的软件叫toolx,试体会一下:
alias toolx = '/your_free_style_path/toolx'
以后每当你敲toolx
,实际敲的是/your_free_style_path/toolx
,路径跟着走,这样也可以愉快地使用软件了。同样,要把这句写进 ~/.bashrc 里并激活,否则效果也是临时的。
alais非常好用。由于可以带着参数一起重命名,就可以这么用:
# 简化常用指令:alias ll = 'ls -l'
# 指定最近常用的工作目录,方便随时跳转alias work ='~/project/analysis/variants/'cd work
# 简化软件的常用代码,比如一步激活一个conda小环境:alias clairev='conda activate clairvoyante-env'
. Q58:如果我不想动配置文件呢?
假设你正在一个目录里分析数据,最近你的工作都在这里,有个软件出现了上述情况,但你不想动系统的配置文件,有办法吗?
有的。你可以把那个软件的启动文件链接过来,就像“新建快捷方式”一样。注意链接要具体到文件名。
ln
-s [对象的路径] [目标位置]
ln -s /your_free_style_path/软件名 ./
其实,既然可以链接到当前目录,何不链接到PATH下的某个目录(如/usr/bin/),更加一劳永逸?
cd /usr/bin/ln -s /your_free_style_path/软件名 ./