shell 类型和环境配置
在 unix 内核的操作系统中(包括 unix 后续延伸出的分支 linux、OS X 等),shell 是和系统内核指令打交道的一座桥梁。
我们通过键盘输入一种自己容易记忆识别的符号标识(shell 命令),由 shell 解析这些命令再反馈给内核去执行一系列操作。
1 Unix shell
我们在美化 MAC 终端时,发现安装有多有 shell 类型:
$ cat /etc/shells # 查看所有安装的 shell
/bin/bash
/bin/csh
/bin/dash
/bin/ksh
/bin/sh
/bin/tcsh
/bin/zsh
- sh:是 Shell 的缩写,是 Unix/Linux 系统的默认shell,也是最古老的shell之一。sh是标准的 POSIX shell,有许多不同版本和实现,如 Bourne shell 和 POSIX shell。
- bash:是 Bourne-Again Shell 的缩写,是 sh 的增强版,具有更多的功能和选项。如提供了命令自动补全、历史记录、别名、作业控制等特性。bash 是大多数 Linux 发行版及 macOS Catalina版本前的默认 shell。
- dash:是 Debian Almquist shell 的缩写,是从 NetBSD 派生而来的轻量级 shell,专门为 Debian 发行版而设计。与 bash 相比,dash 的代码更精简,启动更快,但提供的特性较少。在 Debian 系统上,dash 通常用作 /bin/sh(而不是bash),因为 dash 更加符合 POSIX 标准,并且启动速度更快。
在很多 Linux 中,/bin/sh 是指向 /bin/bash 的,即 /bin/sh 是 /bin/bash 的软链接。
$ ls -l /bin/sh
lrwxrwxrwx 1 root root 4 Oct 15 2017 /bin/sh -> bash
在 Debian 系统和基于 Debian 的发行版中,/bin/sh 是指向 /bin/dash 的。
$ ls -l /bin/sh
lrwxrwxrwx 1 root root 4 Oct 15 2017 /bin/sh -> dash
切换 sh 以使用 bash 而不是 dash 的方法很简单,因为 /bin/sh 是软链接,所以只需更改指向就行。
$ ln -sf /bin/bash /bin/sh # 创建 /bin/bash 的软链接文件 /bin/sh,若目标链接已存在则覆盖
在制作 Docker 镜像是,若想基于此镜像的容器中的 sh 默认使用 bash,可在对应的 Dockerfile 中添加如下行:
RUN ln -sf /bin/bash /bin/sh
1.2 切换 shell
使用 echo $SHELL
查看当前终端的默认 shell,通过 chsh -s
可切换为其他已安装的 shell。 更改后需重启终端,以使命令生效。
$ echo $SHELL # 查看当前默认的 shell
$ chsh -s /bin/zsh # 改变默认的 shell 为 zsh
1.3 shell 的运行模式
shell 有两种运行模式:
- login shell:用户登录系统时启动的 shell。login shell 会读取系统配置文件 (🌰 /etc/profile) 来设置系统的整体环境,同时也会读取用户个人的配置文件(🌰 ~/.bash_profile 或 ~/.bash_login) 来设置用户个人的环境。
- non-login shell:用户登录后启动的第二个 shell。non-login shell 可直接从 login shell 中继承环境和配置,主要用于执行用户在桌面环境下的交互式任务,如打开终端、编辑文件等。
获取 shell 时需要完整登入流程的,从tty1~6终端登入系统输入账号密码,就是 login shell。
无需重复登入流程的,比如在系统内部启动 tty1~6,不用输入账号密码,就为 non-login shell。
2 配置文件
shell 中通过执行配置文件来设置系统与用户的环境变量。不同 shell 的配置文件命名不同。
2.1 bash
bash shell 的配置文件
- /etc/profile、/etc/profile.d/*.sh
- /etc/bashrc
- /.bash_profile、/.bash_login、~/.profile
- ~/.bashrc
- ~/.bash_logout
生效范围:/etc
目录下的配置文件都为全局配置文件,~
用户目录下的配置文件只对该用户生效。
功能:profile
类配置文件和 ~/.bash_login
为 login shell 提供配置,bashrc
类配置文件为 non-login shell 提供配置。
login shell 读取文件顺序:
- 读取整体环境配置:/etc/profile => /etc/profile.d/*.sh (加载 shell 配置)
- 读取用户个人配置:从【/.bash_profile、/.bash_login、~/.profile】中仅读取一个文件。按顺序依次读取,若有一个存在,则后续的不再读取。
- 若 ~/.bash_profile 文件存在的话,一般还会执行 ~/.bashrc 文件。
- ~/.bashrc 则会调用 /etc/bashrc 文件。
- 退出系统 (退出 bash shell) 时,执行 ~/.bash_logout
non-login shell 读取文件顺序:仅读取 ~/.bashrc,找不到时读取 /etc/bashrc。
通俗理解:profile 类文件仅会在启动 bash shell 时读取,而 bashrc 类文件会在每次新开一个终端时都被读取。
Q&A
Q1:为什么若读取了 ~/.bash_profile,一般还会执行 ~/.bashrc ?
A1:因为在 ~/.bash_profile文件中一般会有下面的代码:
if [ -f ~/.bashrc ] ; then
. ./bashrc
fi
~/.bashrc中,一般还会有以下代码:
Q2:为什么 ~/.bashrc 还会调用 /etc/bashrc?
A2:因为 ~/.bashrc 中,一般还会有以下代码:
if [ -f /etc/bashrc ] ; then
. /bashrc
fi
Q3:~/.bash_history 文件是啥?
A3:~/.hash_history 记录前一次登录所执行过的所有历史命令。此次登录所执行的命令都被缓存在内存中,当成功注销系统后,此次命令才会记录到 ./bash_history。
2.2 zsh
从 MacOS Catalina
版本开始,终端的默认 shell 为 zsh。
zsh 的配置文件加载顺序大致如下:
- /etc/zshenv、~/.zshenv
- /etc/zprofile、~/.zprofile
- /etc/zshrc、~/.zshrc
- /etc/zlogin、~/.zlogin
- ~/.zlogout、/etc/zlogout
与 bash 类似,zshrc
文件会在每次新开一个终端窗口时被读取,而 zshenv
文件则只会在每次启动 zsh 时被读取。
❗️如果同时设置了同一个环境变量,zshrc
文件中的设置会覆盖 zshenv
文件中的设置。
对于 zprofile 和 zlogin 的解释:zprofile 和 zlogin 实际上是完全相同的,都用于为 login shell 配置环境,只是读取时间不同。
zprofile 由 Bash 里的 bash_profile 衍化而来,zlogin 则是由 CSH 的 login 变化而来。因为 mac Mojave 版本系统及之前都是以 Bash 为默认的 shell,所以建议用 zprofile。
zsh shell 是不会执行 /etc/profile 和 ~/.bash_profile 文件的,当从 bash 切换为 zsh 时,如果不想再配置一遍 ~/.zshrc 文件,可以在 ~/.zshrc 文件中加上 source ~/.bash_profile,以直接从 ~/.bash_profile 文件读取配置。
参考链接
Linux 和 MacOS 中的 profile 文件详解(一)
Linux 和 MacOS 中的 profile 文件详解(二)
本文作者:Joey-Wang
本文链接:https://www.cnblogs.com/joey-wang/p/18162853
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步