应该知道的系统环境配置文件

在计算机操作系统中Shell是用户与操作系统交互的媒介,而bash作为目前Linux\macOS系统中最常用的Shell,它支持的startup文件也并不单一,甚至让人感到费解,以下就是对Shell的学习

Shell:在计算机中,值“为用户提供用户界面”的软件,通常指的是 命令行界面 的解析器。一般来说,Shell指操作系统中提供访问内核所提供的服务程序。

通常将Shell分为两类

  • 命令行:提供一个命令行界面(CLI)
  • 图形界面:提供一个图形用户界面(GUI)

linux_system

在PC桌面领域,不同的操作系统都有自己的Shell,截止2018.10主流的操作系统市场占有率,Windows(78.04%),OS X(13.73%),Unknown(5.44%),Linux(1.64%),Chrome(1.15%),数据来源于statcounter

这些操作系统中都有自己独特的Shell命令,在不同的系统版本中,命令工具也是不完全相同,例如:

  • Windows:Windows CE、Windows NT常用cmd.exe;Windows 10中常用PowerShell
  • OS X:默认bash,除此之外还提供了tcshzshksh
  • Linux:/etc/shells路径下,/bin/sh/bin/bash/bin/csh等应用

更详细的请查阅维基百科

Configuration Files

文件 sh ksh csh tcsh bash zsh
/etc/.login login login
/etc/csh.cshrc yes yes
/etc/csh.login login login
~/.tcshrc yes
~/.cshrc yes yes
~/etc/ksh.kshrc int.
/etc/sh.shrc int.
$ENV (typically ~/.kshrc) int. int. int.
~/.login login login
~/.logout login login
/etc/profile login login login login
~/.profile login login login login
~/.bash_profile login
~/.bash_login login
~/.bash_logout login
~/.bashrc int.+n/login
/etc/zshenv yes
/etc/zprofile login
/etc/zshrc int.
/etc/zlogin login
/etc/zlogout login
~/.zshenv yes
~/.zprofile login
~/.zshrc int.
~/.zlogin login
  • yes:表示shell在启动时始终读取文件
  • login:表示如果shell是登录shell,则读取文件
  • n/login:表示如果shell不是登录shell,则读取文件
  • int.:表示如果shell是交互式的,则读取文件

更详细的介绍请查阅维基百科

关于常用Shell,执行流程如下图:
flow

startup文件

bash作为目前LinuxmacOS(默认bash命令)系统中最常用的shell,通过上面的表格,我们可以知道macOS系统中,bash主要由以下文件

  • /etc/profile:The systemwide initialization file, executed for login shells
  • ~/.profile:
  • ~/.bash_profile:The personal initialization file, executed for login shells
  • ~/.bash_login:
  • ~/.bash_logout:The individual login shell cleanup file, executed when a login shell exits
  • ~/.bashrc:The individual per-interactive-shell startup file

我们看看在macOS系统中,bash的startup文件是如何进行加载

注意:

  • /etc/profile/etc/paths是系统级别,系统启动后就会加载,后面的配置文件是当前用户级的环境变量
  • 如果~/.bash_profile存在,后面几个文件就会忽略不读,不在时,才会以此类推读取后面的文件
  • ~/.bashrc没有上述规则,他始终加载,它是在bash shell打开的时候载入的

特点

bash的两种属性,即 “交互”“登录”,按照bash是否与用户进行交互,可将其分为 “交互式”“非交互式”;按照bash是否被用户登录,又可将其分为 “登录shell”“非登录shell”

交互式与非交互式

  • 交互式:shell的一种运行模式,交互式shell等待用户输入命令,并且立即执行,然后将结果反馈给用户。整个流程:登录——>执行命令——>退出。当你退出后,这个shell就终止
  • 非交互式:shell的另一种运行模式,它专门用来执行预先设定的命令。这种模式下,shell不予用户进行交互,而是读取存储在脚本文件中的命令并执行它们。当它读取到文件结尾,这个shell就终止

登录shell与非登录shell

  • 登录shell:
    • 用户通过输入用户名/密码(或者证书认证)后启动的shell;
    • 通过带有-l|--login参数的bash命令启动的shell
      例如:系统启动,远程启动,使用su -切换用户,通过bash --login命令启动的bash等
  • 非登录shell:以上情况除外基本就是 “非登录shell”
    例如:从图形化界面启动终端,使用su -切换用户,通过bash命令启动bash等

主要区别

  • 使用logout退出登录shell,使用exit退出非登录shell
  • 其实exit命令会判断当前shell的登录属性,并且分别调用logoutexit指令
  • 登录shell非登录shell的主要区别在于启动shell时所执行的startup文件不同;登录shell执行的startup文件为~/.bash_profile,而非登录shell执行的startup文件为~/.bashrc

总结

Path语法

1
2
# 中间使用冒号分隔
export PATH=$PATH:<PATH 1>:<PATH 2>:<PATH 3>:------:<PATH N>

环境变量设置

全局设置

  • /etc/paths:全局环境变量设置,建议修改此文件
  • /etc/profile:不建议修改此文件,全局配置,不管是哪个用户,登录时都会读取此文件
  • /etc/bashrc:一般在这个文件中添加系统级别环境变量,全局配置,bash shell执行时,不管是何种方式,都会读取此文件

单用户设置

  • ~/.bash_profile:添加用户级环境变量
    例如:设置ANDROID_HOME到PATH
    1
    2
    export ANDROID_HOME=/Users/shaoc/Library/Android/sdk
    export PATH=$ANDROID_HOME/tools:$ANDROID_HOME/platform-tools:$PATH
  • ~/.bashrc 同上
    一般重启shell设置就会生效,如果想立刻生效,则可执行下面的语句:
    1
    source 相应的文件

zsh中配置环境变量

在安装 oh my zsh后,.bash_profile文件中的环境变量就无法起到作用,因为终端默认启动的是zsh,而不是shell,所以无法加载

  • 解决方法
    ~/.zshrc配置文件中,增加对.bash_profile的引用:

    1
    source ~/.bash_profile

    .bash_profile文件示例:

    1
    2
    3
    4
    export ANDROID_HOME=/Users/blade/Library/Android/sdk
    export GRADLE_HOME=/Users/blade/Documents/DevTools/Gradle/gradle-4.6
    export FLUTTER_HOME=/Users/blade/Documents/DevTools/flutter
    export PATH=$ANDROID_HOME/tools:$ANDROID_HOME/platform-tools:$GRADLE_HOME/bin:$FLUTTER_HOME/bin:$PATH

附录

  • 原关于“.bash_profile”和“.bashrc”区别的总结
  • Mac环境变量配置