【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环境变量配置 在自定义安装软件的时候,经常需要 ...
随机推荐
- HI3531串口测试程序(arm)
#include<stdio.h> unsigned int UART0_ADDR = 0x20080000; unsigned int retu=0; int i=0; void del ...
- 《实战Nginx》读书笔记
最近今天读了一本书叫做<实战Nginx:取代Apache的高性能Web服务器>,看后对Nginx 了解了不少.但是还有很多地方不是很了解.不过此书可以作为一本参考手册来使用,里面的讲解很详 ...
- VxWorks下USB驱动总结1
1.USB设备 物理特征:4条电缆,电源线.地线.数据线.脉冲线; 速 度:低速1.5Mbps,全速12Mbps,高速480Mbps; 规范版本:1998年USB1.1,2000年USB2.0; 连 ...
- AM335x(TQ335x)学习笔记——LCD驱动移植
TI的LCD控制器驱动是非常完善的,共通的地方已经由驱动封装好了,与按键一样,我们可以通过DTS配置完成LCD的显示.下面,我们来讨论下使用DTS方式配置内核完成LCD驱动的思路. (1)初步分析 由 ...
- hi3531 SDK 编译 uboot, 修改PHY地址, 修改 uboot 参数 .
一,编译uboot SDK文档写得比较清楚了,写一下需要注意的地方吧. 1. 之前用SDK里和别人给的已经编译好的uboot,使用fastboot工具都刷不到板子上.最后自己用SDK里uboot源码编 ...
- QueryError:Incorrect result size: expected 1, actual 0
1.错误描述 QueryError:Incorrect result size: expected 1, actual 0 2.错误原因 3.解决办法
- JAVA简单的网格布局管理器--JAVA基础
网格布局管理器: GridLayoutDemo.java: import java.awt.GridLayout;import javax.swing.JButton;import javax.swi ...
- 【BZOJ3160】万径人踪灭(FFT,Manacher)
[BZOJ3160]万径人踪灭(FFT,Manacher) 题面 BZOJ 题解 很容易想到就是满足条件的子序列个数减去回文子串的个数吧... 至于满足条件的子序列 我们可以依次枚举对称轴 如果知道关 ...
- [Luogu2852][USACO06DEC]牛奶模式Milk Patterns
Luogu 一句话题意 给出一个串,求至少出现了\(K\)次的子串的最长长度. sol 对这个串求后缀数组. 二分最长长度. 如果有\(K\)个不同后缀他们两两的\(lcp\)都\(>=mid\ ...
- 【BZOJ1483】【HNOI2009】梦幻布丁(启发式合并,平衡树)
[BZOJ1483][HNOI2009]梦幻布丁 题面 题目描述 N个布丁摆成一行,进行M次操作.每次将某个颜色的布丁全部变成另一种颜色的,然后再询问当前一共有多少段颜色.例如颜色分别为1,2,2,1 ...