• shell 脚本实战笔记(2)--环境变量PATH的恩怨情仇


      在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, 进行追加相关路径操作.

     1 pathmunge () {
     2     case ":${PATH}:" in
     3         *:"$1":*)
     4             ;;
     5         *)
     6             if [ "$2" = "after" ] ; then
     7                 PATH=$PATH:$1
     8             else
     9                 PATH=$1:$PATH
    10             fi
    11     esac
    12 }

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

     1 if [ -x /usr/bin/id ]; then
     2     if [ -z "$EUID" ]; then
     3         # ksh workaround
     4         EUID=`id -u`
     5         UID=`id -ru`
     6     fi
     7     USER="`id -un`"
     8     LOGNAME=$USER
     9     MAIL="/var/spool/mail/$USER"
    10 fi

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

     1 # Path manipulation
     2 if [ "$EUID" = "0" ]; then
     3     pathmunge /sbin
     4     pathmunge /usr/sbin
     5     pathmunge /usr/local/sbin
     6 else
     7     pathmunge /usr/local/sbin after
     8     pathmunge /usr/sbin after
     9     pathmunge /sbin after
    10 fi

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

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

    1 HOSTNAME=`/bin/hostname 2>/dev/null`
    2 HISTSIZE=1000
    3 if [ "$HISTCONTROL" = "ignorespace" ] ; then
    4     export HISTCONTROL=ignoreboth
    5 else
    6     export HISTCONTROL=ignoredups
    7 fi
    8 
    9 export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL

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

  • 相关阅读:
    android Serializable 和 Parcelable 区别
    Android HttpClient 用法以及乱码解决
    android 头像选择以及裁剪
    播放动画
    跑马灯效果
    Paint基本属性
    安卓开发中的各种事件
    View类和surfaceView详细介绍
    hadoop资源
    wsdl文件转换为java
  • 原文地址:https://www.cnblogs.com/mumuxinfei/p/3790536.html
Copyright © 2020-2023  润新知