参考:What is the difference between shell, console, and terminal? - Super User[1]Unix / Linux - What is Shells?[2]shell有哪些?Zsh和Bash的区别是什么?- 简书[3]前言一直以来,我都有一个概念上的疑惑,当我们在说terminal, console,再或者是bash, zsh,甚至是linux 的时候,我们到底在说什么。

好像有时候,都在说这个交互窗口:

但事情,似乎并没有这么简单。

shellshell 提供了一个与系统进行交互的环境,它可以运行各种命令,并返回对应的输出。基本的shell 的功能还包括管理前后端的进程,以及查看命令历史,命令行内容编辑的功能。顾名思义,其就相当于机器的一层壳,只要是人与电脑进行交互的接口,都可以称为shell。比如命令行的交互,叫 command-line interface (CLI);mac 或windows 这种图形交互,叫graphical user interface (GUI)。

比较有名的shell 包括bash、zsh、sh 等。其中bash 之前是mac 的默认终端,现在也是zsh了。而zsh,则因其鼎鼎有名的项目 oh my zsh 而广为流行。ps:最近我也在折腾zsh,确实是好玩,而且有很多颜值很高的主题。

terminal在mac 中,有个软件就叫做terminal,翻译为终端。它就是用来运行shell 的软件。曾经终端是一个物理设备(this was a physical device consisting of little more than a monitor and keyboard)。但到现在,终端已经抽象为了一个软件。

准确来说,console 就是控制机器的控制面板,个人理解,有点像玩街机的时候,底下操纵的那些摇杆。而terminal,则是遥控设备的远程器械。比如我们通过terminal 连接服务器进行操作。

但console,感觉各种定义也并不完全一致,比如R studio 或vs code 中,直接和python 或R 交互的窗口就是console。而mac 中的console,则是用来查看系统日志的应用。

知乎也有讨论:(10 封私信 / 67 条消息) Terminal 和 Console 的区别是什么?- 知乎[4]

常见的shell参考:几种常见的Shell:sh、bash、csh、tcsh、ash_C语言中文网[5]

shsh 的全称是 Bourne shell,由 AT&T 公司的 Steve Bourne开发,为了纪念他,就用他的名字命名了。sh 是 UNIX 上的标准 shell,很多 UNIX 版本都配有 sh。sh 是第一个流行的 Shell。

cshsh 之后另一个广为流传的 shell 是由柏克莱大学的 Bill Joy 设计的,这个 shell 的语法有点类似C语言,所以才得名为 C shell ,简称为 csh。Bill Joy 是一个风云人物,他创立了 BSD 操作系统,开发了 vi 编辑器,还是 Sun 公司的创始人之一。

tcshtcsh 是 csh 的增强版,加入了命令补全功能,提供了更加强大的语法支持。

ash一个简单的轻量级的 Shell,占用资源少,适合运行于低内存环境,但是与下面讲到的 bash shell 完全兼容。

bashbash shell 是 Linux 的默认 shell。

zshzsh能基本完美兼容bash的命令,并且使用起来更加优雅。

查看使用的shell通过 cat 命令来查看当前 Linux 或mac系统的可用 Shell:

代码语言:javascript代码运行次数:0运行复制❯ cat /etc/shells

# List of acceptable shells for chpass(1).

# Ftpd will not allow users to connect who are not using

# one of these shells.

/bin/bash

/bin/csh

/bin/dash

/bin/ksh

/bin/sh

/bin/tcsh

/bin/zsh

并且可以查看当前的shell:

代码语言:javascript代码运行次数:0运行复制❯ echo $SHELL

/bin/zsh

在配置文件方面:

bash读取的配置文件:~/.bash_profile文件zsh读取的配置文件:~/.zshrc文件切换shell:

代码语言:javascript代码运行次数:0运行复制chsh -s /bin/bash # 切换bash

chsh -s /bin/zsh # 切换zsh

代码语言:javascript代码运行次数:0运行复制 chsh

Change the user's login shell.

More information: https://manned.org/chsh.

- Change the current user's login shell interactively:

chsh

- Change the login shell of the current user:

chsh -s path/to/shell

- Change the login shell for a given user:

chsh -s path/to/shell username

- List available shells:

chsh --list-shells

当我们切换了shell 时,比如bash 到zsh,可以直接在.zshrc文件中加上source ~/.bash_profile,从而更快的完成如conda 在内的环境的配置。

总结一下个人感觉,terminal,就是和计算机交互的一个软件,只不过我们一般使用的并非是图像化的;而 shell 则是与系统真正交互的环境,比如我们可以在一个terminal 下,先操作自己的计算机,再用ssh 等工具连接到其他计算机或服务器。我们的实际操作,则是在对应系统下的shell 中进行的。

当然,我个人来说对这些抽象的概念还是比较模糊的。但至少,当你说shell 和 terminal 的时候,我至少知道,你说的是我本地操作的终端软件,还是终端中运行的和机器进行交互的shell 软件了。

ps:为什么不可以统一terminal 跟shell呢?比如mac 直接打开一个shell,进去不也是shell吗?

参考资料[1]

What is the difference between shell, console, and terminal? - Super User: https://superuser.com/questions/144666/what-is-the-difference-between-shell-console-and-terminal

[2]

Unix / Linux - What is Shells?: https://www.tutorialspoint.com/unix/unix-what-is-shell.htm#:~:text=Shell%20is%20an%20environment%20in%20which%20we%20can,its%20own%20set%20of%20recognized%20commands%20and%20functions.

[3]

shell有哪些?Zsh和Bash的区别是什么?- 简书: https://www.jianshu.com/p/a891af6f87e0

[4]

(10 封私信 / 67 条消息) Terminal 和 Console 的区别是什么?- 知乎: https://www.zhihu.com/question/20388511

[5]

几种常见的Shell:sh、bash、csh、tcsh、ash_C语言中文网: http://c.biancheng.net/cpp/view/6995.html