这是我参与11月更文挑战的第12天,活动详情查看:2021最后一次更文挑战。
shell
确认当前终端tty使用的Shell类型:
Shell(Unix Shell)是一种命令行解释器,是Unix操作系统下最传统的人机接口。 Shell脚本是解释执行的,不需要编译,和大部分的编程语言很相似,也有基本的变量和流程控制语句。我们平时使用Shell有两种方式:
- 输入命令,执行,这种方式称为交互式(
Interactive); - 批处理(
Batch)方式,用户事先写好Shell脚本文件,然后顺序执行脚本中的命令。 第一个Shell环境是Thompson Shell,在贝尔实验室开发并于1971年发布。
现代Shell最突出的祖先是被称为sh的BourneShell,这是以在AT&T工作的创始人Stephen Bourne命名的。
Shell一直在基于这个概念,不断添加各种新功能,演变出很多种的Shell。 例如,很早版本的OS X中使用的是: tcsh作为默认的Shell。这是由csh(C shell),一种类似C语言的Shell演变而来。 在OS X 10.3版与10.4版之后,默认的Shell是:bash,由GNU开发。
除了默认的bash,现在macOS中,默认的Shell变成了zsh。这是一种由Paul Falstad于1990年开发的。它是一个Bourne式Shell,它使用bash和previous shell的特性,并添加了更多的特性:
- 拼写检查功能
- 内置的编程特性
- 友好的交互
与此同时,macOS还提供了很多其他种类的Shell:
.bashrc、.bash_profile和.zshrc作用与区别
在使用命令行工具时,我们可能会遇到一些教程,可能需要你把一些配置写入到.bashrc、.bash_profile或者.zshrc等。那么这几个文件到底有什么作用和区别?
首先,从文件名称判断.bashrc、.bash_profile是给Bash来使用的。而.zshrc是给zsh来使用的。
交互式登录和非登录Shell
当调用Shell时,Shell从一组启动文件中读取信息并执行命令。读取什么文件就取决于Shell是作为交互式登录还是非登录调用。
换言之,Shell分为交互式的或非交互式的:
- 交互式
Shell是读取和写入到用户终端的Shell程序,用户在终端上输入命令,并在回车后立即执行。 - 非交互式
Shell是与终端不相关的Shell程序,例如执行脚本时。 交互式Shell可以是登录Shell,也可以是非登录Shell。 当用户通过ssh或本地远程登录到终端时,或者使用--login选项启动时,将调用登录shell。
当作为交互式登录Shell调用时,Bash会先查找/etc/profile文件,如果该文件存在,它将运行文件中列出的命令。然后,搜索
~/.bash_profile,~/.bash_login以及~/.profile文件,顺序读取。
当Bash作为交互式非登录shell调用时,会读取~/.bashrc。
所以说,.bashrc和.bash_profile之间的区别是,.bash_profile当Bash作为交互式登录shell调用时被读取并执行,而.bashrc对于交互式非登录shell被执行。
大多数Linux/Unix发行版都使用~/.profile代替~/.bash_profile。~/.profile所有shell都读取该文件,而~/.bash_profile只有Bash才会读取该文件。
~/.zshrc是zsh的交互式shell的用户配置。
对于Bash,它们的工作方式如下:
- 读取适当的内容,执行
A,然后执行B,然后执行C,依此类推。B1,B2,B3表示仅执行找到的那些文件中的第一个。
+----------------+-----------+-----------+------+
| |Interactive|Interactive|Script|
| |login |non-login | |
+----------------+-----------+-----------+------+
|/etc/profile | A | | |
+----------------+-----------+-----------+------+
|/etc/bash.bashrc| | A | |
+----------------+-----------+-----------+------+
|~/.bashrc | | B | |
+----------------+-----------+-----------+------+
|~/.bash_profile | B1 | | |
+----------------+-----------+-----------+------+
|~/.bash_login | B2 | | |
+----------------+-----------+-----------+------+
|~/.profile | B3 | | |
+----------------+-----------+-----------+------+
|BASH_ENV | | | A |
+----------------+-----------+-----------+------+
| | | | |
+----------------+-----------+-----------+------+
| | | | |
+----------------+-----------+-----------+------+
|~/.bash_logout | C | | |
+----------------+-----------+-----------+------+
对于
zsh,它们的工作方式如下:
- 读取适当的内容,执行
A,然后执行B,然后执行C,依此类推。
+----------------+-----------+-----------+------+
| |Interactive|Interactive|Script|
| |login |non-login | |
+----------------+-----------+-----------+------+
|/etc/zshenv | A | A | A |
+----------------+-----------+-----------+------+
|~/.zshenv | B | B | B |
+----------------+-----------+-----------+------+
|/etc/zprofile | C | | |
+----------------+-----------+-----------+------+
|~/.zprofile | D | | |
+----------------+-----------+-----------+------+
|/etc/zshrc | E | C | |
+----------------+-----------+-----------+------+
|~/.zshrc | F | D | |
+----------------+-----------+-----------+------+
|/etc/zlogin | G | | |
+----------------+-----------+-----------+------+
|~/.zlogin | H | | |
+----------------+-----------+-----------+------+
| | | | |
+----------------+-----------+-----------+------+
| | | | |
+----------------+-----------+-----------+------+
|~/.zlogout | I | | |
+----------------+-----------+-----------+------+
|/etc/zlogout | J | | |
+----------------+-----------+-----------+------+
确认当前是登录还是非登录shell
在tty中执行echo $0,输出的Shell如果前面带-,说明是登录Shell。
配置建议
bash:
- 将配置选项放到
~/.bashrc中,然后在~/.bash_profile中通过source调用。
- zsh`:
- 建议仍然将配置选项放到
~/.bashrc,~/.bash_profile中通过source调用,最后在~/.zshrc中source调用~/.bash_profile。