一直以来,我都有一个概念上的疑惑,当我们在说terminal, console,再或者是bash, zsh,甚至是linux 的时候,我们到底在说什么。
好像有时候,都在说这个交互窗口:
但事情,似乎并没有这么简单。
shell 提供了一个与系统进行交互的环境,它可以运行各种命令,并返回对应的输出。基本的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,确实是好玩,而且有很多颜值很高的主题。
在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:sh、bash、csh、tcsh、ash_C语言中文网[5]
sh 的全称是 Bourne shell,由 AT&T 公司的 Steve Bourne开发,为了纪念他,就用他的名字命名了。sh 是 UNIX 上的标准 shell,很多 UNIX 版本都配有 sh。sh 是第一个流行的 Shell。
sh 之后另一个广为流传的 shell 是由柏克莱大学的 Bill Joy 设计的,这个 shell 的语法有点类似C语言,所以才得名为 C shell ,简称为 csh。Bill Joy 是一个风云人物,他创立了 BSD 操作系统,开发了 vi 编辑器,还是 Sun 公司的创始人之一。
tcsh 是 csh 的增强版,加入了命令补全功能,提供了更加强大的语法支持。
一个简单的轻量级的 Shell,占用资源少,适合运行于低内存环境,但是与下面讲到的 bash shell 完全兼容。
bash shell 是 Linux 的默认 shell。
zsh能基本完美兼容bash的命令,并且使用起来更加优雅。
通过 cat 命令来查看当前 Linux 或mac系统的可用 Shell:
❯ 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:
❯ echo $SHELL
/bin/zsh
在配置文件方面:
切换shell:
chsh -s /bin/bash # 切换bash
chsh -s /bin/zsh # 切换zsh
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