分享

Linux 环境变量的所有知识

 迷途中小小书童 2020-11-12

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

每个人的系统设置不同,显示结果可能不太一样。
乍一看,长长一串很让人头晕。但仔细看一下,会发现:

PATH的内容是多个目录,彼此由冒号(:)隔开,除此之外也没啥玄机了。当你启动某个命令或软件,系统会按这些目录的顺序寻找相应的启动文件。

我们可以用which指令查看某命令当前的位置,如:

$ which samtools
/usr/bin/samtools

$
 which nanopolish
/home/ubuntu/miniconda3/bin/nanopolish

你会发现,能正常使用的指令,其路径在PATH变量里都有迹可循。如果都找不到,系统就会报错。前几天介绍的生信分析必备的软件管理系统conda(我们装的是其精简版miniconda3),就能有效避免这种问题。
你是否还记得,最初安装miniconda的时候,中途会问你:

Installation finished
Do you wish the installer to initialize the Miniconda3
in 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/软件名 ./

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多