Linux下经常听说shell,terminal等之类的概念,最近终于大概明白是什么意思。

shell命令,shell以及终端terminal的关系大致如下:

graph LR; A[Command Line</br>命令&脚本]-->B[Terminal</br>编辑器]; B-->C[Shell</br>解释器]; C-->D[System</br>系统];

由浅入深,在显示器里可以看到的是Terminal终端以及在终端中输入的命令。通过不可见的Shell的解释,在系统中运行,最后将结果返回终端界面。

Commands

Command Line如常用的lscd等命令,也包括比较复杂的管道和重定向等。

Terminal

终端相当于一个编辑器外壳,如Ubuntu里经典的Gnome-terminal。这个网址列出了一些常用的终端,有些支持字体的大小和颜色配置,有些支持分屏,有些支持标签等。终端只是一个外壳,不影响命令的解释和运行。

贴一个我在用的Deepin Terminal,透明背景和分屏功能蛮赞:

<img src=http://yalei.name/images/deepTerminal.png class=”img-responsive”/>

Shell

Shell是任务是对命令进行解释,进而执行。不同的解释器对语法的支持也是不同的,cat /etc/shells查看系统可用的解释器。一般有以下几个:

关于这几个解释器的起源,可以看看介绍。 sh是最早的解释器,现在Linux系统一般都默认使用bash。注意在写Shell脚本时,一般也是调用bash,在首行写#!/bin/bash

最后推荐下Zsh,主要在路径补全代码提示高亮等方面有很大提升,可以看看这个介绍Why Zsh is Cooler than Your Shell

另外,Zsh具有很强的可配置性,常用一个配置是oh-my-zsh

System

最后是系统,一般Mac和类Unix系统都默认搭载有terminal和bash,而Windows用户需要安装Cygwin之类的软件才能模拟运行shell命令。