/etc/profile和/etc/bashrc、~/.bash_profile和~/.bashrc、.zshrc和.zprofile的区别

简介

默认情况下,您的 Mac 使用 zsh 或 bash 作为登录 Shell 和交互式 Shell 的命令行解释器:

  • bash 是 macOS Mojave 及更低版本中的默认 Shell。
  • zsh 从 macOS Catalina 版开始,您的 Mac 将使用 zsh 作为默认登录 Shell 和交互式 Shell。
    与 Bourne Shell (sh) 高度兼容,并且与 bash 基本兼容,但存在一些差别。要进一步了解 zsh 及其全面的命令行完成系统,请在“终端”中输入 man zsh

如何查看自己使用的是哪一个shell

echo $SHELL

查看系统安装了哪些shell

cat /etc/shells

运行中的Bash有两种模式: login shell 和 non-login shell

1、login shell(登录Shell):就是需要输入用户名及密码登录的shell,如开机shell登录、ssh登录、su - username(从root切换到其他用户时无需密码)。
2、non-login shell:无需输入密码,如bash、su username、图形界面打开bash。
bashrc用于交互式non-login shell,而profile用于交互式login shell。系统中存在许多bashrc和profile文件

bash Shell

登录Shell

  1. /etc/profile(系统级(全局)配置文件):此文件为系统的所有登录用户设置环境信息,当用户第一次登录时,该文件被执行,并从/etc/profile.d目录的配置文件中搜集shell的设置。
  2. ~/.bash_profile:每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次!默认情况下,他设置一些环境变量,执行用户的
    .bashrc文件。
    此文件类似于/etc/profile,也是需要需要重启才会生效,/etc/profile对所有用户生效,~/.bash_profile 只对当前用户生效!
  3. ~/.profile:(针对个人)若bash是以login方式执行时,读取~/.bash_profile,若它不存在,则读取~/.bash_login,若前两者不存在,读取~/.profile。另外,图形模式登录时,此文件将被读取,即使存在~/.bash_profile~/.bash_login
    ~/.zshrc:无论登录和非登录用户都可以读取

非登录Shell

  1. /etc/bashrc(系统级(全局)配置文件):为每一个运行bash shell的用户执行此文件, 当bash shell被打开时或在用户主目录下找不到.bashrc时,就会读取这该文件。
  2. ~/.bashrc:该文件包含专用于你的bash shell的bash信息,当登录时以及每次打开新的shell时,该文件被读取.(每个用户都有一个.bashrc文件,在用户目录下)。
    此文件类似于/etc/bashrc,不需要重启生效,重新打开一个bash即可生效, /etc/bashrc对所有用户新打开的bash都生效,但~/.bashrc只对当前用户新打开的bash生效。但一般 来说都会在~/.bash_profile里调用~/.bashrc脚本以便统一配置用户环境。
    ~/.bashrc等中设定的变量(局部)只能继承/etc/profile中的变量,他们是"父子"关系.
  3. ~/.bash_logout:当每次退出系统(退出bash shell)时,执行该文件。
  4. ~/.bash_history:是bash shell的历史记录文件,里面记录了你在bash shell中输入的所有命令。可通过HISSIZE环境变量设置在历史记录文件里保存记录的条数。alias l = ‘ls -l’是设置别名的语句,把它放在这些配置文档中就可使我们能用简单的’l’命令,代替’ls -l’命令。

另外:不要轻易修改 /etc/environment 文件。


zsh Shell

从 macOS Catalina 版开始,您的 Mac 将使用 zsh 作为默认登录 Shell 和交互式 Shell。

~/.zprofile 的作用与 ~/.bash_profile 相同,并且在登录时运行(包括通过 SSH 运行)
~/.zshrc 的作用与 ~/.bashrc 相同,并针对每个新的“终端”会话运行

  • 说明: 如何切换到 zsh 描述文件和提示符
    如果您正在使用 bash 描述文件(例如,为了设置环境变量、别名或路径变量),则您应改为使用作用与它相同的 zsh 描述文件。

1、如何更改默认 Shell

无论您的用户帐户是配置为使用 zsh(推荐)、bash 还是其他 Shell,您都可以从“用户与群组”偏好设置或命令行中更改默认 Shell。

  • 从“用户与群组”偏好设置中更改
    选取苹果菜单  >“系统偏好设置”,然后点按“用户与群组”。
    点按锁形图标 ,然后输入您的帐户名称和密码。
    在左侧的用户列表中,按住 Control 键点按您的用户名,然后选取“高级选项”。
    从“登录 Shell”菜单中选取一个 Shell,然后点按“好”以存储更改。

  • 从命令行中更改
    在“终端”中,输入 $ chsh -s path,其中的 path 是 /etc/shells 中列出的某个 Shell 路径,例如 /bin/zsh、/bin/bash、/bin/csh、/bin/dash、/bin/ksh、/bin/sh 或 /bin/tcsh,比如:$ chsh -s /bin/zsh$ chsh -s /bin/bash

如何在不更改默认 Shell 的情况下使用其他 Shell
如果您不希望“终端”在新的“终端”窗口和标签页中使用默认的登录 Shell,请按照以下步骤操作:
打开“终端”,然后选取“终端”>“偏好设置”。
从“通用”面板中,选择“命令(完整的路径)”。
在提供的栏位中,输入 /etc/shells 中列出的某个 Shell 路径,例如 /bin/zsh、/bin/bash、/bin/csh、/bin/dash、/bin/ksh、/bin/sh 或 /bin/tcsh。

2、在配置文件方面

bash读取的配置文件:

open -e ~/.bash_profile
// vim ~/.bash_profile
// sudo vim ~/.bash_profile

zsh读取的配置文件:

open -e ~/.zshrc
// vim ~/.zshrc
// sudo vim ~/.zshrc

没有电脑不存在,则新建一个配置文件:

touch .bash_profile //在用户(~)目录下
// touch ~/.bash_profile //任何目录下都可以用这个命令

当从bash切换为zsh时,如果不想重新配置一遍.zshrc文件,可以__在.zshrc文件中加上source ~/.bash_profile,从而直接从.bash_profile文件读取配置。

使环境变量生效

source ~/.zprofile

查看变量是否生效

echo $PATH

重启所有终端

macOS下打开的shell是登录式交互shell,登录Shell(不管是不是交互式的)文件加载顺序如下:
/etc/profile
~/.bash_profile(,如果安装了zsh,则.bash_profile 文件中的环境变量就无法起到作用,会加载~/.zprofile,这里面可以配置python环境变量等)
~/.bash_login
~/.profile

下面是几个例子:
首先需要明确的是,读取 ~/.bash_profile,该文件便会去读取~/.bashrc,而~/.bashrc又会去读取/etc/bashrc。所以只要读取~/.bash_profile,便会同时读取~/.bashrc/etc/bashrc

  1. 图形模式登录时,顺序读取:/etc/profile~/.profile

  2. 图形模式登录后,打开终端时,顺序读取:~/.bashrc/etc/bashrc

  3. 文本模式登录时,顺序读取:/etc/profile~/.bash_profile~/.bashrc/etc/bashrc

  4. 从其它用户su到该用户,则分两种情况:

    (1)如果带-l参数(或-参数,--login参数),如:su -l username,则bash是lonin的,它将顺序读取以下配置文件:/etc/profile~/.bash_profile~/.bashrc/etc/bashrc

    (2)如果没有带-l参数,则bash是non-login的,它将顺序读取:~/.bashrc/etc/bashrc并从父进程继承其环境变量。

  5. 注销时,或退出su登录的用户,如果是longin方式,那么bash会读取:~/.bash_logout

  6. 执行自定义的shell文件时,若使用“bash -l a.sh”的方式,则bash会读取行:/etc/profile,~/.bash_profile,~/.bashrc/etc/bashrc,用sh -l a.sh调用bash,它将会执行/etc/profile以及 ~/.profile。若使用其它方式,如:bash a.sh./a.shsh a.sh,则不会读取上面的任何文件,只能从其父进程处继承环境变量,像alias等就无法继承使用了。

  7. 上面的例子凡是读取到~/.bash_profile的,若该文件不存在,则读取~/.bash_login,若前两者不存在,读取~/.profile

参考:
https://blog.csdn.net/weixin_49539546/article/details/123536394
https://blog.csdn.net/qq_43516969/article/details/107726153?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1-107726153-blog-85060825.pc_relevant_default&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1-107726153-blog-85060825.pc_relevant_default&utm_relevant_index=1

你可能感兴趣的:(/etc/profile和/etc/bashrc、~/.bash_profile和~/.bashrc、.zshrc和.zprofile的区别)