• Shell总结10-shell运行环境


    Shell总结10-shell运行环境、模式

    系统范围配置文件

    /etc/profile

    /etc/profile通常存放系统基础环境变量,比如:PATH, USER, MAIL, HOSTNAME等等。 有些发行版也会把umask放进来,并不建议用户自定义修改。

    $cat /etc/profile
    # /etc/profile
    
    # System wide environment and startup programs, for login setup
    # Functions and aliases go in /etc/bashrc
    
    # It's NOT a good idea to change this file unless you know what you
    # are doing. It's much better to create a custom.sh shell script in
    # /etc/profile.d/ to make custom changes to your environment, as this
    # will prevent the need for merging in future updates.
    
    pathmunge () {
        case ":${PATH}:" in
            *:"$1":*)
                ;;
            *)
                if [ "$2" = "after" ] ; then
                    PATH=$PATH:$1
                else
                    PATH=$1:$PATH
                fi
        esac
    }
    
    if [ -x /usr/bin/id ]; then
        if [ -z "$EUID" ]; then
            # ksh workaround
            EUID=`/usr/bin/id -u`
            UID=`/usr/bin/id -ru`
        fi
        USER="`/usr/bin/id -un`"
        LOGNAME=$USER
        MAIL="/var/spool/mail/$USER"
    fi
    
    # Path manipulation
    if [ "$EUID" = "0" ]; then
        pathmunge /usr/sbin
        pathmunge /usr/local/sbin
    else
        pathmunge /usr/local/sbin after
        pathmunge /usr/sbin after
    fi
    
    HOSTNAME=`/usr/bin/hostname 2>/dev/null`
    HISTSIZE=1000
    if [ "$HISTCONTROL" = "ignorespace" ] ; then
        export HISTCONTROL=ignoreboth
    else
        export HISTCONTROL=ignoredups
    fi
    
    export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL
    
    # By default, we want umask to get set. This sets it for login shell
    # Current threshold for system reserved uid/gids is 200
    # You could check uidgid reservation validity in
    # /usr/share/doc/setup-*/uidgid file
    if [ $UID -gt 199 ] && [ "`/usr/bin/id -gn`" = "`/usr/bin/id -un`" ]; then
        umask 002
    else
        umask 022
    fi
    
    for i in /etc/profile.d/*.sh /etc/profile.d/sh.local ; do
        if [ -r "$i" ]; then
            if [ "${-#*i}" != "$-" ]; then 
                . "$i"
            else
                . "$i" >/dev/null
            fi
        fi
    done
    
    unset i
    unset -f pathmunge
    

    /etc/profile.d/

    目录下用来放置一些定制化的系统级别的环境设置,比如系统级别针对vi的关联

    [root@nginx-node01 ~]# cat /etc/profile.d/vim.sh 
    if [ -n "$BASH_VERSION" -o -n "$KSH_VERSION" -o -n "$ZSH_VERSION" ]; then
      [ -x /usr/bin/id ] || return
      ID=`/usr/bin/id -u`
      [ -n "$ID" -a "$ID" -le 200 ] && return
      # for bash and zsh, only if no alias is already set
      alias vi >/dev/null 2>&1 || alias vi=vim
    fi
    

    /etc/bashrc

    如果系统安装有多个类型的shell,那么最好把专门针对bash的配置写在这里,这里会判断shell当前以何种模式运行(是否交互式、是否登录式)来设置不同的环境变量。

    cat /etc/bashrc 
    # /etc/bashrc
    
    # System wide functions and aliases
    # Environment stuff goes in /etc/profile
    
    # are we an interactive shell?
    if [ "$PS1" ]; then
      if [ -z "$PROMPT_COMMAND" ]; then
        case $TERM in
        xterm*|vte*)
          if [ -e /etc/sysconfig/bash-prompt-xterm ]; then
              PROMPT_COMMAND=/etc/sysconfig/bash-prompt-xterm
          elif [ "${VTE_VERSION:-0}" -ge 3405 ]; then
              PROMPT_COMMAND="__vte_prompt_command"
          else
              PROMPT_COMMAND='printf "33]0;%s@%s:%s07" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/~}"'
          fi
          ;;
        screen*)
          if [ -e /etc/sysconfig/bash-prompt-screen ]; then
              PROMPT_COMMAND=/etc/sysconfig/bash-prompt-screen
          else
              PROMPT_COMMAND='printf "33k%s@%s:%s33\" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/~}"'
          fi
          ;;
        *)
          [ -e /etc/sysconfig/bash-prompt-default ] && PROMPT_COMMAND=/etc/sysconfig/bash-prompt-default
          ;;
        esac
      fi
      # Turn on parallel history
      shopt -s histappend
      history -a
      # Turn on checkwinsize
      shopt -s checkwinsize
      [ "$PS1" = "\s-\v\$ " ] && PS1="[u@h W]\$ "
      # You might want to have e.g. tty in prompt (e.g. more virtual machines)
      # and console windows
      # If you want to do so, just add e.g.
      # if [ "$PS1" ]; then
      #   PS1="[u@h:l W]\$ "
      # fi
      # to your custom modification shell script in /etc/profile.d/ directory
    fi
    
    if ! shopt -q login_shell ; then # We're not a login shell
        # Need to redefine pathmunge, it get's undefined at the end of /etc/profile
        pathmunge () {
            case ":${PATH}:" in
                *:"$1":*)
                    ;;
                *)
                    if [ "$2" = "after" ] ; then
                        PATH=$PATH:$1
                    else
                        PATH=$1:$PATH
                    fi
            esac
        }
    
        # By default, we want umask to get set. This sets it for non-login shell.
        # Current threshold for system reserved uid/gids is 200
        # You could check uidgid reservation validity in
        # /usr/share/doc/setup-*/uidgid file
        if [ $UID -gt 199 ] && [ "`/usr/bin/id -gn`" = "`/usr/bin/id -un`" ]; then
           umask 002
        else
           umask 022
        fi
    
        SHELL=/bin/bash
        # Only display echos from profile.d scripts if we are no login shell
        # and interactive - otherwise just process them to set envvars
        for i in /etc/profile.d/*.sh; do
            if [ -r "$i" ]; then
                if [ "$PS1" ]; then
                    . "$i"
                else
                    . "$i" >/dev/null
                fi
            fi
        done
    
        unset i
        unset -f pathmunge
    fi
    # vim:ts=4:sw=4
    

    用户私有配置文件

    ~/.bash_profile

    用户环境的首选配置文件。 在此文件中,用户可以添加其他配置选项或更改默认设置

    [nginx@nginx-node01 ~]$ cat ~/.bash_profile 
    # .bash_profile
    
    # Get the aliases and functions
    if [ -f ~/.bashrc ]; then
            . ~/.bashrc
    fi
    
    # User specific environment and startup programs
    
    PATH=$PATH:$HOME/.local/bin:$HOME/bin
    
    export PATH
    

    ~/.bashrc

    针对非登录式的shell

    [nginx@nginx-node01 ~]$ cat ~/.bashrc 
    # .bashrc
    
    # Source global definitions
    if [ -f /etc/bashrc ]; then
            . /etc/bashrc
    fi
    
    # Uncomment the following line if you don't like systemctl's auto-paging feature:
    # export SYSTEMD_PAGER=
    
    # User specific aliases and functions
    

    ~/.bash_login

    /.bash_profile不存在时候会加载/.bash_login

    ~/.profile

    如果没有/.bash_profile和/.bash_login,shell则会读取~/.profile。除了bash之外其他类型的shell也会读取

    ~/.bash_logout

    当shell退出时,将执行~/.bash_logout中的命令

    shell运行模式

    交互式、非交互式

    [root@xuexi ~]# echo $PS1
    [u@h W]$			#判断变量PS1,如果值非空,则为交互式
    
    [root@xuexi ~]# echo $-	
    himBH				#如果值中含有字母"i",表示交互式。
    

    登录式、非登录式

    [root@xuexi ~]# shopt login_shell  
    login_shell     on		 #值为"on"表示为登录式
    
  • 相关阅读:
    未能加载文件或程序集“System.Web.Helpers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35”或它的某一个依赖项。系统找不到指定的文件。
    无法识别的属性“targetFramework”。请注意属性名称区分大小写。
    The provider is not compatible with the version of Oracle client
    新建MVC3项目时出错:错误 2 类型“System.Web.Mvc.ModelClientValidationRule”同时存在于“C:\Program Files\Microsoft ASP.NET\ASP.NET Web Pages\v2.0\Assemblies\System.Web.WebPages.dll”和“C:\Program Files\Microsoft ASP.NET\ASP.NET MVC 3\Assembli
    MVC3 在IIS7 部署
    IIS7 IIS6 解析JSON (解决JSON格式的 Method Not Allowed )
    Administrator Note: An error message detailing the cause of this specific request failure can be found in the application event log of the web server.
    在学习js的然后写代码的过程中我老是找不到思路怎么办?
    你男朋友是程序员吧
    杨绛先生送给年轻人的9句话,值得一读再读!
  • 原文地址:https://www.cnblogs.com/elfcafe/p/13273166.html
Copyright © 2020-2023  润新知