这是我参与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
。