【Linux】 环境变量与shell配置&执行
■ 变量与环境变量
shell环境通常存在很多变量,变量可以通过echo $VAR或${VAR}的方式查看。set命令可以查看当前环境中的所有变量(包括一般的自定义变量和环境变量)
变量的设置通过简单的赋值命令进行。比如TESTVAR=abc,就是设置了TESTVAR的值为abc(注意等号两边都没有空格,值也不能有空格,有空格就要用引号引起来)。
取消变量的设置可以通过unset命令,如unset TESTVAR。
变量中有一些特殊的变量被称为环境变量。环境变量的意义在于它可以被子进程继承,继而被多个进程共用。由于linux的子进程生成机制是fork-and-exec,所以子进程的环境变量其实是父进程的一个副本,子进程开始运行后就与父进程互相独立了。通过export命令可以将一般的自定义变量转化为环境变量用于进程间通讯。env命令可以查看所有环境变量。
■ shell配置文件与环境变量
通过SSH连接centos是一个常见的场景。登录时,由sshd进程打开一个虚拟终端的子进程,再由虚拟终端进程打开一个bash子进程,这个bash进程就是我们通过这个连接运行所有指令的原点。
顺带一提,打开bash时会有欢迎信息,这些信息配置在/etc/issue(通过终端登录时)和/etc/motd(通过模拟终端登录时)。
在正式看bash的配置文件之前,有必要先了解一下login-shell和non-login-shell。从最表象的层面来说,打开bash时需要输入账号密码的shell就是login-shell,反之则不是。前者例子有通过终端登录linux系统或者SSH远程登录模拟终端时,后者的例子有通过图形化界面打开终端,或者在终端中运行bash再开一个子进程的shell等情况。
在cenots下打开一个bash的shell时,会读取一些配置文件,加载一些基本的,常用的变量到shell中来。通常会涉及到的配置文件主要有四个:
A. /etc/profile
B. ~/.bash_profile
C. ~/.bashrc
D. /etc/bashrc
通常,打开的是一个login-shell的时候会加载的配置文件是A和B。(说B是只有一个.bash_profile其实也是不太严谨的。如果home中.bash_profile不存在则会寻找.bash_login,若它也不存在则寻找.profile。三者按照优先级顺序找到一个就加载,其他的就不管了)但是通常,B的具体执行内容中有加载C的步骤,而C的执行内容中又有加载D的步骤,所以一般而言四个都会被加载。由于B和C是每个用户home目录下自身的文件,可能有所不同,这点也需要注意。相对的A是所有用户共用的文件。
若打开的是一个non-login-shell的话,那么只会加载C和D。值得一提的是,D这个文件是redhat系统特有的文件,在其中做出了redhat标志性的一些配置(比如PS1的样式)。C这个文件在/etc/skel中有备份,如果不小心删除了可以去那里拿一份回来。
除了上面四个外,还有一些配置文件也和bash的运行息息相关。
~/.bash_history 记录了当前bash的命令执行历史,其大小和环境变量HISTSIZE相关。history命令就是读取这个文件的。历史命令并不会随着我们操作同步写入,我们可以想象是这样的:登录时读取这个文件把HISTSIZE条命令加载到内存中,由于HISTSIZE通常是1000,以1000举例。然后随着我们不断输入命令,内存中这1000条不断被更新,总量始终维持在1000。当我们注销登录时将这更新后的1000条再次写入此文件。由于命令记录和bash进程相关联,但是.bash_history一个用户只有一个,所以当同一个用户用不同bash进程做了不同操作的时候,更新的信息以最后一个注销的用户为准。
~/.bash_logout 注销登录时留给用户做一些事的接口。我们可以在里面写上一些注销登录时要机器自动帮你做的事情,比如记录登出的时间等等。
■ 几种运行可执行程序(包括运行sh脚本)的区别
对于可执行文件,Linux提供了多种执行方法,按照分类主要有:
1. 通过路径执行如相对or绝对路径:./test.sh 、/tmp/test.sh
这种执行方法需要当前用户对被执行的文件有执行的权限,且如果是一个shell脚本的话在脚本头应该声明相应的解释器如#!/bin/bash。从执行程序的角度而言通过相对或绝对路径执行没有区别。
由于一般命令的执行本质也是先找到环境变量PATH中的相关路径再执行,所以可以视为这一类执行方式。因此,一般命令的执行也都是开了一个子进程的shell来执行的。
2. shell命令执行
通过shell程序的指令执行如: bash test.sh、sh test.sh
通过这种方法执行的程序本身无需有执行权限,只要有读权限即可。被执行程序作为一个shell程序的参数运行。
3. 以读取环境变量的方式执行
如: source test.sh 、 . test.sh
这种方式和前两种最大的区别在于,前两种都是在现有shell中开启一个子进程的shell,然后把程序放到子进程的shell环境中执行,执行完成后即关闭子进程shell。而这种方式直接在当前shell环境中执行。所以如果被执行程序中含有对环境变量的增改,且希望保留结果到当前shell环境中的,则需要使用这种方法执行。
【Linux】 环境变量与shell配置&执行的更多相关文章
- linux环境变量设置和默认执行语句设置
环境变量设置 1.export export ORACLE_HOME=/usr/local/instantclient_12_2export PATH=$ORACLE_HOME:$PATHexport ...
- Linux环境变量从用户配置改为系统配置
部署了一个新的tomcat到一个新的用户下,发下启动失败了 /home/personal/apache-tomcat/bin/catalina.sh: line 434: /usr/lib/jvm/j ...
- Linux中环境变量文件及配置
Linux中环境变量文件及配置 一.环境变量文件介绍 转自:http://blog.csdn.net/cscmaker/article/details/7261921 Linux中环境变量包括系统 ...
- Linux中环境变量文件及配置(转载)
一.环境变量文件介绍 转自:http://blog.csdn.net/cscmaker/article/details/7261921 Linux中环境变量包括系统级和用户级,系统级的环境变量是每个登 ...
- Linux环境变量配置全攻略
Linux环境变量配置 在自定义安装软件的时候,经常需要配置环境变量,下面列举出各种对环境变量的配置方法. 下面所有例子的环境说明如下: 系统:Ubuntu 14.0 用户名:uusama 需要配置M ...
- Linux环境变量配置方法
Linux上环境变量配置分为设置永久变量和临时变量两种.环境变量设置方法同时要考虑环境Shell类型,不同类型的SHELL设置临时变量方法和设置永久变量对应的配置文件不同.Linux环境变量本身配置过 ...
- linux 环境变量配置方式
linux 环境变量可以在多个文件中配置 说明: linux bash 运行模式分为两种: login shell 和non-login shell, 两种登录模式启动是加载的配置文件不一样. 1. ...
- Linux 环境变量配置的 6 种方法,建议收藏
关注「开源Linux」,选择"设为星标" 回复「学习」,有我为您特别筛选的学习资料~ Linux环境变量配置 在自定义安装软件的时候,经常需要配置环境变量,下面列举出各种对环境变量 ...
- 超详干货!Linux 环境变量配置全攻略
点击上方"开源Linux",选择"设为星标" 回复"学习"获取独家整理的学习资料! Linux环境变量配置 在自定义安装软件的时候,经常需要 ...
随机推荐
- stm32开发之串口的调试
总的函数如下 void USART1Configuration(void){ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Peri ...
- echarts中地图提示"TypeError:i is undefined"
1.错误描述 2.错误原因 刚开始地图的数据源是由静态数据提供,后来修改成从数据库中获取,请求数据的方法成功后调用地图方法,但是初始化时未调用数据请求方法,导致地图核心js报错 3.解决办法 初始化时 ...
- 【mongodb系统学习之七】mongodb的关闭
七.mongodb的关闭: 1).直接根据进程id杀死mongodb进程,如图(注意,kill -9要慎用,这个是强制关闭进程,可能导致文件损坏,尽量不要用,可以直接kill不加参数): 2).如果不 ...
- Linux显示一个二进制文件或可执行文件的完整路径
Linux显示一个二进制文件或可执行文件的完整路径 youhaidong@youhaidong-ThinkPad-Edge-E545:~$ which halt /sbin/halt
- Django学习-11-请求相关信息
requests对象是由类创建的 from django.core.handlers.wsgi import WSGIRequest --> 类 request.environ中封装了请求 ...
- Excel 转 vCard格式、CSV格式
Excel 转vCard格式(常用于Gmail, Yahoo, 163等).CSV格式(常用于Outlook, Foxmail等) 最近公司邮件通讯录需要更新,我就将原来的通讯录给删除了,准备重新导入 ...
- 省市县从数据库读出来的list数据转换成json格式的数据
一,数据源 1.1,数据库查出来的数据是 两张表先各自左外连接,然后在相互左外连接查找省市县的数据(业务需求必须这样做,省市去的是第一张表,而市县取的是第二张表,两张表中间通过市的名字连接)见这个博文 ...
- C#抽象方法与抽象实例--C#基础
1.抽象方法与抽象类的声明 1)抽象类和抽象方法声明必须包含abstract 2)抽象方法的声明没有方法体:public abstract void fly(); 3)抽象类和抽象法前加上public ...
- 求小于n的素数个数
本文是对 LeetCode Count Primes 解法的探讨. 题目: Count the number of prime numbers less than a non-negative num ...
- Bzoj5093: 图的价值
题面 Bzoj Sol 一张无向无重边自环的图的边数最多为\(\frac{n(n-1)}{2}\) 考虑每个点的贡献 \[n*2^{\frac{n(n-1)}{2} - (n-1)}\sum_{i=0 ...