■  变量与环境变量

  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配置&执行的更多相关文章

  1. linux环境变量设置和默认执行语句设置

    环境变量设置 1.export export ORACLE_HOME=/usr/local/instantclient_12_2export PATH=$ORACLE_HOME:$PATHexport ...

  2. Linux环境变量从用户配置改为系统配置

    部署了一个新的tomcat到一个新的用户下,发下启动失败了 /home/personal/apache-tomcat/bin/catalina.sh: line 434: /usr/lib/jvm/j ...

  3. Linux中环境变量文件及配置

    Linux中环境变量文件及配置   一.环境变量文件介绍 转自:http://blog.csdn.net/cscmaker/article/details/7261921 Linux中环境变量包括系统 ...

  4. Linux中环境变量文件及配置(转载)

    一.环境变量文件介绍 转自:http://blog.csdn.net/cscmaker/article/details/7261921 Linux中环境变量包括系统级和用户级,系统级的环境变量是每个登 ...

  5. Linux环境变量配置全攻略

    Linux环境变量配置 在自定义安装软件的时候,经常需要配置环境变量,下面列举出各种对环境变量的配置方法. 下面所有例子的环境说明如下: 系统:Ubuntu 14.0 用户名:uusama 需要配置M ...

  6. Linux环境变量配置方法

    Linux上环境变量配置分为设置永久变量和临时变量两种.环境变量设置方法同时要考虑环境Shell类型,不同类型的SHELL设置临时变量方法和设置永久变量对应的配置文件不同.Linux环境变量本身配置过 ...

  7. linux 环境变量配置方式

    linux 环境变量可以在多个文件中配置 说明: linux bash 运行模式分为两种: login shell 和non-login shell, 两种登录模式启动是加载的配置文件不一样. 1. ...

  8. Linux 环境变量配置的 6 种方法,建议收藏

    关注「开源Linux」,选择"设为星标" 回复「学习」,有我为您特别筛选的学习资料~ Linux环境变量配置 在自定义安装软件的时候,经常需要配置环境变量,下面列举出各种对环境变量 ...

  9. 超详干货!Linux 环境变量配置全攻略

    点击上方"开源Linux",选择"设为星标" 回复"学习"获取独家整理的学习资料! Linux环境变量配置 在自定义安装软件的时候,经常需要 ...

随机推荐

  1. 详解Java的自动装箱与拆箱(Autoboxing and unboxing)

    一.什么是自动装箱拆箱 很简单,下面两句代码就可以看到装箱和拆箱过程 //自动装箱 Integer total = 99; //自定拆箱 int totalprim = total; 简单一点说,装箱 ...

  2. Hi3515支持NFS-ROOT启动

    目前在做Hi3515平台监控项目,前期开发一直使用SDK里推荐的mount nfs方式来调试代码,虽然也算方便,但是我一直觉得用法NFS-ROOT才是最省事的方法,而且最接近最终用户使用环境,因为如果 ...

  3. HI3531例子程序说明

    Hisilicon Hi35xx 样例程序使用说明 1. 样例程序文件结构说明    sample            # MPP 样例程序     |-- common       # hi35x ...

  4. FusionCharts 2D柱状图和折线图的组合图调试错误

    在设计FusionCharts 2D柱状图和折线图的组合图的时候,我发现不管怎么重启服务器,组合图就是不出来.后来,我通过调试发现我犯了一个致命的错误,运用平常一贯的思维,认为3D图有这种类型,那么2 ...

  5. JDBC异常之数据库表不存在

    JDBC异常之数据库表不存在 1.具体错误如下: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:Table 'YHD.t_yhd_ ...

  6. freemarker报错之五

    1.错误描述 freemarker.core.ParseException: Token manager error: freemarker.core.TokenMgrError: Lexical e ...

  7. Linux显示目前与过去登入系统的用户相关信息

    Linux显示目前与过去登入系统的用户相关信息 youhaidong@youhaidong-ThinkPad-Edge-E545:~$ last youhaido pts/0 :0 Sat Jan 2 ...

  8. HTML5可以省略全部标记的元素

    HTML5可以省略全部标记的元素 1.body 2.colgroup 3.html 4.head 5.tbody

  9. hdu2262 Where is the canteen

    Where is the canteen Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Ot ...

  10. 异常-----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 ...