简介
默认情况下,您的 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
/etc/profile
(系统级(全局)配置文件):此文件为系统的所有登录用户设置环境信息,当用户第一次登录时,该文件被执行,并从/etc/profile.d目录的配置文件中搜集shell的设置。~/.bash_profile
:每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次!默认情况下,他设置一些环境变量,执行用户的
.bashrc
文件。
此文件类似于/etc/profile
,也是需要需要重启才会生效,/etc/profile
对所有用户生效,~/.bash_profile
只对当前用户生效!~/.profile
:(针对个人)若bash是以login方式执行时,读取~/.bash_profile
,若它不存在,则读取~/.bash_login
,若前两者不存在,读取~/.profile
。另外,图形模式登录时,此文件将被读取,即使存在~/.bash_profile
和~/.bash_login
。
~/.zshrc
:无论登录和非登录用户都可以读取
非登录Shell
/etc/bashrc
(系统级(全局)配置文件):为每一个运行bash shell的用户执行此文件, 当bash shell被打开时或在用户主目录下找不到.bashrc时,就会读取这该文件。~/.bashrc
:该文件包含专用于你的bash shell的bash信息,当登录时以及每次打开新的shell时,该文件被读取.(每个用户都有一个.bashrc文件,在用户目录下)。
此文件类似于/etc/bashrc
,不需要重启生效,重新打开一个bash即可生效,/etc/bashrc
对所有用户新打开的bash都生效,但~/.bashrc
只对当前用户新打开的bash生效。但一般 来说都会在~/.bash_profile
里调用~/.bashrc
脚本以便统一配置用户环境。
~/.bashrc
等中设定的变量(局部)只能继承/etc/profile
中的变量,他们是"父子"关系.~/.bash_logout
:当每次退出系统(退出bash shell)时,执行该文件。~/.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
。
- 图形模式登录时,顺序读取:
/etc/profile
和~/.profile
。 - 图形模式登录后,打开终端时,顺序读取:
~/.bashrc
和/etc/bashrc
。 - 文本模式登录时,顺序读取:
/etc/profile
,~/.bash_profile
,~/.bashrc
和/etc/bashrc
。 - 从其它用户su到该用户,则分两种情况:
(1)如果带-l参数(或-参数,--login参数),如:
su -l username
,则bash是lonin的,它将顺序读取以下配置文件:/etc/profile
,~/.bash_profile
,~/.bashrc
和/etc/bashrc
。(2)如果没有带-l参数,则bash是non-login的,它将顺序读取:
~/.bashrc
和/etc/bashrc
并从父进程继承其环境变量。 - 注销时,或退出su登录的用户,如果是longin方式,那么bash会读取:
~/.bash_logout
- 执行自定义的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.sh
,sh a.sh
,则不会读取上面的任何文件,只能从其父进程处继承环境变量,像alias等就无法继承使用了。 - 上面的例子凡是读取到
~/.bash_profile
的,若该文件不存在,则读取~/.bash_login
,若前两者不存在,读取~/.profile
。
文章评论