在linux环境下, 相信大家对环境变量PATH, 多多少少有所接触, 这边讲讲PATH的在linux的前世因缘.

  先讲讲一个列子
  假如我们在为一个新的应用配置其PATH路径中时,  不小心忽略了原先的$PATH内容, 把原本的PATH=/path/to/newcmd:$PATH, 写成了PATH=/path/to/newcmd, 并不小心写入了~/.bashrc, 并且source ~/.bashrc.
  这时会发生什么? 我们如何去处理这种情况?

  

  所有的命令都不能用了, 想回去编辑~/.bashrc, 可惜为时已晚, vim命令找不到了.
  究其本质的原因:

  

  此时, 你想到的解决方法是什么?
  重新登录? 呵呵.

  
  要让大家失望了, 还是不行, linux新建会话, 都会为登录用户构建相应的环境变量, 最后会执行source ~/.bashrc, 依旧导致PATH为空.

  如何破, 先看下shell的命令分类. 实际上shell命令分两种, 内嵌命令和外部命令. 内嵌命令是shell自带的, 而外部命令是shell通过环境变量PATH去查找.
  怎么区分, 一个命令到底是shell内嵌, 还是外部命令?

  

  type命令能很好的区分一个命令的分类属性, 比如cd, read, printf, 包括type命令自身皆为内嵌命令, 而ls, cat等则为外部命令.

  由于PATH被设置为空, 导致shell无法查到该外部命令所在的路径, 自然不能执行, 但是该命令的二进制文件依旧存在, 因此可以指定其绝对路径来执行, 就可以.

  

  去除误设置的环境变量PATH, 同时重新登录即可.

  

  重新export 环境变量PATH亦可, 通过vi命令, 对bashrc变量进行设置, 然后重新登录.

  linux的登录会话生效时, 会先执行/etc/profile文件(该文件对所有用户都生效), 然后执行用户相关的${HOME}/.bashrc文件. 那/etc/profile中, 主要对环境变量作了那些工作?

  查阅/etc/profile文件

  1). 首先定义了pathmunge函数, 该函数对环境变量PATH, 进行追加相关路径操作.

 pathmunge () {
case ":${PATH}:" in
*:"$1":*)
;;
*)
if [ "$2" = "after" ] ; then
PATH=$PATH:$
else
PATH=$:$PATH
fi
esac
}

  2). 设置用户的EUID, 标识实际的登录用户ID, 对于root用户, id默认为0

 if [ -x /usr/bin/id ]; then
if [ -z "$EUID" ]; then
# ksh workaround
EUID=`id -u`
UID=`id -ru`
fi
USER="`id -un`"
LOGNAME=$USER
MAIL="/var/spool/mail/$USER"
fi

  3). 依据EUID, 对环境变量PATH进行相关路径的追加

 # Path manipulation
if [ "$EUID" = "" ]; then
pathmunge /sbin
pathmunge /usr/sbin
pathmunge /usr/local/sbin
else
pathmunge /usr/local/sbin after
pathmunge /usr/sbin after
pathmunge /sbin after
fi

  这边可以看出, 不同的用户, 指定不同的路径. 这在线上系统, 对不同用户和角色设置不同的PATH对应的路径, 是有必要的.

  4). 最后进行相关的环境变量的导出

 HOSTNAME=`/bin/hostname >/dev/null`
HISTSIZE=
if [ "$HISTCONTROL" = "ignorespace" ] ; then
export HISTCONTROL=ignoreboth
else
export HISTCONTROL=ignoredups
fi export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL

  这就是系统默认的环境变量, PATH, USER, LOGNAME, MAIL, HOSTNAM等的来源

shell 脚本实战笔记(2)--环境变量PATH的恩怨情仇的更多相关文章

  1. shell 脚本实战笔记(1)--source/fork/exec的区别

    在linux shell编程中, 随着脚本处理规模的变大, 会嵌套调用子进程. 但父进程以不同的方式调用子进程, 其结果和背后的机制不尽相同.这边就简单描述下source/fork/exec调用子进程 ...

  2. [读书笔记]Linux命令行与shell编程读书笔记02 环境变量以及其他

    1. Linux的环境变量. 全局环境变量的查看 printenv 一个结果示例 XDG_SESSION_ID=354TERM=xtermSHELL=/bin/bashSSH_CLIENT=10.24 ...

  3. shell 脚本实战笔记(10)--spark集群脚本片段念念碎

    前言: 通过对spark集群脚本的研读, 对一些重要的shell脚本技巧, 做下笔记. *). 取当前脚本的目录 sbin=`dirname "$0"` sbin=`cd &quo ...

  4. shell 脚本实战笔记(6)--集群环境配置检测

    1). 背景: 集群部署的时候, 需要一致的配置和环境设置. 对于虚拟机集群, 可以借助镜像拷贝, 复制和还原集群机器. 对与物理机集群而言, 则不一样, 如果机器一多, 多人去操作和配置, 对于成熟 ...

  5. shell 脚本实战笔记(7)--集群网络相关知识和环境搭建

    前言: 对网络相关的知识, 做下笔记. 包括IP地址A/B/C的分类, 静态地址的配置/DNS配置, 以及网卡相关信息查看. *) A/B/C/D类网络地址的划分 IP地址=网络地址+主机地址 或 I ...

  6. shell 脚本实战笔记(11)--Mysql在linux下的安装和简单运维

    前言: linux中安装mysql以及配置的管理, 基础的运维和管理还是需要会一些的. 这边作下笔记, 以求天天向上(^_^). 安装流程:*). 安装mysql-server1). 借助yum检索相 ...

  7. shell 脚本实战笔记(8)--ssh免密码输入执行命令

    前言: ssh命令, 没有指定密码的参数. 以至于在脚本中使用ssh命令的时候, 必须手动输入密码, 才能继续执行. 这样使得脚本的自动化执行变得很差, 尤其当ssh对应的机器数很多的时候, 会令人抓 ...

  8. shell 脚本实战笔记(9)--linux自动批量添加用户

    前言: 添加linux用户帐号,这个相对简单, 在面对集群, 许多机器的时候, 我们该如何去做和实现? 这篇短文, 简单讲解一些思路, 尽可能地涉及周边的一些知识点. 不光是运维人员会面临这个问题, ...

  9. shell 脚本实战笔记(4)--linux磁盘分区重新挂载

    背景: Hadoop的HDFS文件系统的挂载, 默认指定的文件目录是/mnt/disk{N}. 当运维人员, 不小心把磁盘挂载于其他目录, 比如/mnt/data, /mnt/disk01, /mnt ...

随机推荐

  1. python 插值查找

    def binary_search(lis, key): low = 0 high = len(lis) - 1 time = 0 while low < high: time += 1 # m ...

  2. 小波变化库——Pywalvets学习笔记

    笔记 术语(中英对照): 尺度函数:scaling function(又称父函数 father wavelet) 小波函数:wavelet function(又称母函数 mother wavelet) ...

  3. 音视频学习系列第(五)篇---MediaRecorder的使用

    音视频系列 什么是MediaRecorder MediaRecorder是安卓提供的一个用于音视频采集的类 在前几篇文章中,我们已经介绍了如何进行音频和视频的采集,即通过AudioRecord采集音频 ...

  4. SQL脚本去重分组统计

    需求:首先有一张表记录学生姓名.科目和成绩,然后模拟插入几条数据,脚本如下: create table score ( Name ),--姓名 subject ),--科目 grade int--成绩 ...

  5. EF学习-获取实体框架01

    实体框架由 EF 设计器(包含在 Visual Studio 中)和 EF Runtime(在 NuGet 上提供)组成. EF 设计器包含在 Visual Studio 中 最新版本的实体框架设计器 ...

  6. PHP函数总结 (六)

    <?php /** * 递归函数(自调用函数): * 在函数体内直接或间接的自己调用自己 * 通常有一个条件判断是否需要执行递归,并且在特定条件下终止函数的递归调用动作,把目前流程的主控制权交回 ...

  7. gleez开发环境搭建

    一.虚拟主机目录配置 1.配置apache服务器 Apache是常用的web服务器,即常见的用来处理http协议,处理网页的. Apache的配置文件都存放在/etc/apache2/目录,这里有很多 ...

  8. Leetcode 90

    // 重复元素在去重的时候会出现顺序不同去不了重,这时候需要对add进行排序class Solution { public: vector<vector<int>> subse ...

  9. java 中利用异或实现两个变量互换

    一般实现两个变量之间的互换要用第三个变量,这样做可以,但创建新变量,增加了系统开销.如果要交换的变量时两个整数型变量,可以用更高效的方法.例如:^(异或)操作,举例如下: package chapte ...

  10. sql 智能提示

    依次打开SSMS—>工具—>选项—>文本编辑器—>Transact-SQL—>IntelliSense—>检查右侧窗体是否启用!!