Linux学习--No.5探索环境

在之前刚接触生信数据分析时,要使用conda下载生信软件,但总是提示命令找不到。后来才知道是环境变量的原因,这次专门来学习下环境变量~

1、一些概念

  • 环境变量(environment variable):用来储存有关shell会话和工作环境的信息,以便程序或shell中运行的脚本能够轻松访问到它们。(可能比较难理解,看下去就能有一个自己的理解了)
  • 全局环境变量:对于shell会话与所生成的子shell都是可见的环境变量;一般系统为bash shell设置了众多的全局环境变量(p111),这些系统环境变量全为大写字母,以区别普通用户的环境变量。
  • 局部环境变量:只对创建它们的shell可见的环境变量。

2、查看环境变量

(1)全局变量:到处可用

printenv   #查看所有全局变量
printenv HOME  #查看某一全局变量
  • 牢牢记住如果要用到变量,要使用$;如果要操作变量,不使用$。
echo $HOME
ls $HOME

(2)局部变量:定义进程才可用

  • 没有专门显示局部变量的命令;
  • set命令会显示为某一特定进程设置的所有变量,包括局部变量、全局变量、用户定义变量。
set

3、用户定义变量

(1)设置局部环境变量

  • 通过等号给环境变量赋值,值可以使数值或字符串。
  • 格式上变量名、等号和值之间不能有空格。
  • 若值为含有空格的字符串,需要在两边加上英文引号。
  • 只能在定义它的进程(shell)中使用。
first=Hello
echo=$first
second="How are you"
echo=$second
bash  #创建子shell
echo=$second

用户定义局部变量时要用小写字母,以示区别。

(2)设置全局环境变量

  • 先创建一个局部环境变量,然后用export命令把它导出到全局环境中。
  • 所有进程均可以使用。但是如果子shell修改该全局变量,父shell不会做出改变。(一般也不会碰到这种情况吧)
ake="ha ha"
export ake
#如果要用到变量,要使用$;如果要操作变量,不使用$
echo $ake
bash
echo $ake

(3)删除环境变量

  • unset命令
  • 如果父shell创建的全局变量,在子shell中删除它,父shell中不会受到影响。类似修改全局变量。
echo $ake
unset ake
echo $ake

4、设置PATH环境变量

  • 当输入一个外部命令(比如conda),shell必须搜索系统来找到对应的程序。
  • PATH环境变量定义了用于进行命令和程序查找的目录。shell在此环境变量里查找命令的目录列表,由冒号分隔。
echo $PATH
  • 但常见的问题是应用程序放置可执行文件(miniconda)的目录常常不在PATH环境变量所包含的目录中,只能使用绝对路径执行,比较麻烦。

方法一:手动PATH添加

把新的搜索目录添加到现有的PATH环境变量。 由于PATH中各个目录之间用冒号分隔,因此只需要引用原来的PATH值,然后再给这个字符串添加新目录就行了。参考教材代码如下:

echo $PATH
#myscripts为一个简单的脚本程序
myscripts  #出现报错提示
/home/li/myscripts   #绝对路径才能执行
PATH=$PATH:/home/li/myscripts
echo $PATH
myscripts

如果希望子shell也能找到程序位置,要记得把修改后的PATH环境变量导出。

  • 注意,对PATH变量的修改只能持续到退出或重启系统,不能永久持续。

方法二:环境变量永久化

  • 启动文件/环境文件:当登入Linux系统启动一个bash shell时,默认情况下bash会在这几个文件中查找命令。
  • 启动文件根据启动bash shell 方式不同的分类如下:
    A、默认登录shell

需要输入用户名和密码后才能使用shell的方式;一般通过ssh登录shell时(比如我之前的服务器登录方式)为交互式的登录shell

  • 其启动文件有两类。一类是 /etc/profile ;一类是$HOME目录启动文件。

(1)主目录 /etc/profile
其为bash shell 默认的主启动文件。只要登录了Linux系统,bash就会执行/etc/profile启动文件里的命令。一般不同的Linux发行版的该文件不尽相同。详细介绍见p118

cat /etc/profile

(2)用户$HOME目录启动文件
有如下四种,一般只会用到1-2个(常用$HOME/.bashrc),用来提供一个用户专属的启动文件来定义该用户所用到的环境变量。

  • $HOME/.bashrc
  • $HOME/.bash_profile
  • $HOME/.bash_login
  • $HOME/.profile

$HOME表示某个用户的主目录,等同于波浪号。其次上述四个文件均以点号开头,为隐藏文件。

cat $HOME/.bashrc

B、非登录shell的交互式shell

在Linux桌面环境下打开终端的方式(比如之前安装虚拟机运行的Ubuntu Linux系统进入终端的方式),不需要输入用户名与密码

  • 特点:不会访问/etc/profile,只会检查用户用户HOME目录里的 .bashrc文件
  • .bashrc文件用于查看/etc 目录下通用的bashrc文件,同时为用户提供一个定制自己的命令别名及私有脚本函数的地方。

此外还有非交互式shell(脚本用)以及上述两种的详细介绍见p119

划重点!讲了这些,最关键的问题还是如何将用户定义的环境变量持久化?
在大多数发行版中,存储个人用户永久性bash shell 变量的地方是$HOME/.bashrc文件,这适用于所有类型的shell进程

回到一开始提到的那个 conda命令找不到的问题,后来是执行下述代码解决的。现在再回头看就容易理解了。

cat ~/.bashrc
nano ~/.bashrc  #编辑文本
#将下面一行代码输入到最后
echo ‘export  PATH=“home/user/miniconda3/bin:$PATH”’ >> ~/.bashrc
#保存退出
cat ~/.bashrc
source ~/.bashrc

教材最后还介绍了数组变量,因为不常用,就不深入学习了。
参考自《Linux命令行与shell脚本编程大全》

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容