iOS之认识Shell-1

这是我参与11月更文挑战的第12天,活动详情查看:2021最后一次更文挑战

shell

确认当前终端tty使用的Shell类型:


Shell(Unix Shell)是一种命令行解释器,是Unix操作系统下最传统的人机接口。 Shell脚本是解释执行的,不需要编译,和大部分的编程语言很相似,也有基本的变量和流程控制语句。我们平时使用Shell有两种方式:

  • 输入命令,执行,这种方式称为交互式(Interactive);
  • 批处理(Batch)方式,用户事先写好Shell脚本文件,然后顺序执行脚本中的命令。

第一个Shell环境是Thompson Shell,在贝尔实验室开发并于1971年发布。
现代Shell最突出的祖先是被称为shBourneShell,这是以在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年开发的。它是一个BourneShell,它使用bashprevious 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_profileBash作为交互式登录shell调用时被读取并执行,而.bashrc对于交互式非登录shell被执行。

大多数Linux/Unix发行版都使用~/.profile代替~/.bash_profile~/.profile所有shell都读取该文件,而~/.bash_profile只有Bash才会读取该文件。
~/.zshrczsh的交互式shell的用户配置。

对于Bash,它们的工作方式如下:

  • 读取适当的内容,执行A,然后执行B,然后执行C,依此类推。B1B2B3表示仅执行找到的那些文件中的第一个。
+----------------+-----------+-----------+------+
|                |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

配置建议

  1. bash
  • 将配置选项放到~/.bashrc中,然后在~/.bash_profile中通过source调用。
  1. zsh`:
  • 建议仍然将配置选项放到~/.bashrc~/.bash_profile中通过source调用,最后在~/.zshrcsource调用~/.bash_profile

猜你喜欢

转载自juejin.im/post/7029479218237538334