【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环境变量配置 在自定义安装软件的时候,经常需要 ...
随机推荐
- 详解Java的自动装箱与拆箱(Autoboxing and unboxing)
一.什么是自动装箱拆箱 很简单,下面两句代码就可以看到装箱和拆箱过程 //自动装箱 Integer total = 99; //自定拆箱 int totalprim = total; 简单一点说,装箱 ...
- Hi3515支持NFS-ROOT启动
目前在做Hi3515平台监控项目,前期开发一直使用SDK里推荐的mount nfs方式来调试代码,虽然也算方便,但是我一直觉得用法NFS-ROOT才是最省事的方法,而且最接近最终用户使用环境,因为如果 ...
- HI3531例子程序说明
Hisilicon Hi35xx 样例程序使用说明 1. 样例程序文件结构说明 sample # MPP 样例程序 |-- common # hi35x ...
- FusionCharts 2D柱状图和折线图的组合图调试错误
在设计FusionCharts 2D柱状图和折线图的组合图的时候,我发现不管怎么重启服务器,组合图就是不出来.后来,我通过调试发现我犯了一个致命的错误,运用平常一贯的思维,认为3D图有这种类型,那么2 ...
- JDBC异常之数据库表不存在
JDBC异常之数据库表不存在 1.具体错误如下: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:Table 'YHD.t_yhd_ ...
- freemarker报错之五
1.错误描述 freemarker.core.ParseException: Token manager error: freemarker.core.TokenMgrError: Lexical e ...
- Linux显示目前与过去登入系统的用户相关信息
Linux显示目前与过去登入系统的用户相关信息 youhaidong@youhaidong-ThinkPad-Edge-E545:~$ last youhaido pts/0 :0 Sat Jan 2 ...
- HTML5可以省略全部标记的元素
HTML5可以省略全部标记的元素 1.body 2.colgroup 3.html 4.head 5.tbody
- hdu2262 Where is the canteen
Where is the canteen Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Ot ...
- 异常-----freemarker.template.TemplateException: Expected collection or sequence. datas evaluated instead to freemarker.core.HashLiteral$SequenceHash on line 7, column 18 in inc/select.ftl.
1.错误描述 六月 26, 2014 11:26:27 下午 freemarker.log.JDK14LoggerFactory$JDK14Logger error 严重: Template proc ...