• home > OS > Linux > Shell >

    Shell Script概述:历史/作用——知乎阅读笔记

    Author:zhoulujun Date:

    从功能上讲,伪终端取代了原始终端设备与主机连接模型中的通信线缆,而且是在内存中实现高速通信。负责解释执行用户输入的命令并返回结果的,正是Shell!它是沟通用户和系统内核的中间桥梁。

    shell的管道是unix设计哲学的精华。能用grep, awk, sed和简单数组,循环搞定的,就用不着perl, python,翻过来如果需要map等复杂结构,就可以用严肃脚本了。

    Shell 是什么

    Shell其实就是字面意思--壳. 一个系统有内核(Kernel)自然就有外壳(Shell). 在 Linux 上广义的 Shell 就是与用户交互的界面, 图形化界面是 Shell, 命令行界面也是 Shell. 狭义上的 Shell 就是 Linux 上的命令行界面. 一般发行版上的命令行界面是 bash, 而 debian 的是 dash. 下面的讨论基于侠义的 Shell.

    kernel是内核,shell是外壳,实际上shell就可以认为是操作系统,只不过是一个命令行的,没有图形界面的操作系统实际上,目前很多的linux系统在开机的初始化进程都是用shell起来的,例如linux系统的大多是init.d下的一堆脚本,android的initrc也是类似脚本

    Shell 的作用

    Shell 是用来执行计算机程序的. 例如执行 mkdir 就是创建一个文件夹, 执行 touch 就是创建一个文件. 执行 ps 就是查看进程信息. 其中 mkdir, touch, ps 都是用 C 语言编写编译后的程序。

    Shell 直接与计算机交互吗

    Shell 直接与计算机交互吗? 得看计算机是什么的一个概念. 如果计算机是指硬件的话.。那么 Shell 是不能直接与计算机交互的, 操作硬件只能由 Kernel 进行, 而调用 Kernel 的功能只能通过系统调用来完成, 而 Shell 不具有系统调用的能力. 如果计算机是一个抽象概念的话,那么 Shell 能够通过执行其他程序来达到修改计算机状态的目的, 所以可以说 Shell 可以与计算机交互。

    注意, 与计算机的交互最终必须通过系统调用(system call)完成 , Shell 调用 mkdir 其实是调用一个程序, 这个程序是用 C 语言实现(gnu_coreutils mkdir 源码), 其中最核心的是 mkdir(char* path, int access) 这个系统调用。

    都说 Shell 可以直接与计算机交互,但是我想其他语言不也能方便的与计算机进行交互吗

    其他语言不也能方便的与计算机进行交互吗?

    其他语言与计算机交互也是直接或间接的通过系统调用来完成. 很多语言的系统调用是通过库的形式封装了. 如 python 的 os.mkdir(), 就是封装了  mkdir(char* path, int access) 系统调用. 当然python 也可以使用 subprocess.call('mkdir xxx') 调用外部的 mkdir 程序实现, 这基本就是 Shell 的做法。

    终端、Shell、系统内核与用户的关系示意.jpg早期的计算机控制台

    那么到底哪个效率更高呢?

    Shell 的调用是进程级别的切换,,而其它语言一般使用调用库的方法实现系统调用, 这是栈级别的切换. Shell 一旦复杂了就是频繁的进程切换, 对于系统来说进程切换是十分重量级的操作,而栈级别的切换要轻量得多。

    Shell 的优势是什么?

    Shell 的优势就是能轻易调用所有用其他语言编写的程序. 例如调用 mkdir 程序, Shell 就是 mkdir, 而其他语言可能是 sbuprocess.call('mkdir xxx'); Shell 调用 docker Shell 就是 docker run xxx, docker delete xxx, 其他语言可能是 subprocess.call("docker run xxx") 之类的.

    Shell 实现的功能,其他语言也能实现,可能会稍微复杂一些,难道 Shell 就这点优势吗?

    Shell 实现的功能, 基本上是用其他语言实现了之后再调用的, 那么很明显其他语言实现和 Shell 语言实现就是鸡和鸡蛋的关系.


    shell脚本是一种比python更“糙”、因此性能等方面更为受限的语言;但它有个极大的优点,那就是可以把其他人写的程序本身,像其他语言的库函数那样使用。为了做到这个,它要求每个程序都把命令行参数当作“函数输入”、向stdout/stderr的输出当作函数输出,同时以程序返回值说明执行成功与否。这个约定是强制性的,在操作系统设计时就确定了的——这也是C语言的main函数需要返回一个int的原因。但是,这个“命令行参数”的约定也束缚了shell,使得它比起其他语言更在乎空格/回车等符号——因为它的每一行,都必须是“命令 参数1 参数2”的格式。这个约定就使得它语法怪异,也很难像其他编程语言那样,支持语法结构的任意嵌套——不管有多像,它毕竟是“用命令行模拟出来的语法结构”。那么,这就是shell脚本的定位:它是一种只能支持较为简单逻辑的、可以直接把任意现有程序当作函数无缝集成的“超高级语言”;但因为“命令行模拟”这个本质,它的语法较为笨拙,很难像正规的脚本语言那样得到很多很多的语法糖或者其它便利。但,同样的,其它脚本语言语法结构是灵活了;但它们也就不可能很方便的和系统安装的现有程序交互了——注意是不方便,不是不能。你完全可以通过popen/shellexec等方法调用外部程序。

    Shell 主要的作用是什么? - invalid s的回答 - 知乎

    https://www.zhihu.com/question/309875771/answer/579235911



    Shell 主要的作用是什么? - invalid s的回答 - 知乎 https://www.zhihu.com/question/309875771/answer/579235911

    Shell 主要的作用是什么? - q14447的回答 - 知乎 https://www.zhihu.com/question/309875771/answer/585214919

    Linux Cygwin知识库(一):一文搞清控制台、终端、shell概念 https://zhuanlan.zhihu.com/p/61369678

    shell好难学,能用python替代shell吗? - 杨志丰的回答 - 知乎 https://www.zhihu.com/question/51810278/answer/127615877



    转载本站文章《Shell Script概述:历史/作用——知乎阅读笔记》,
    请注明出处:https://www.zhoulujun.cn/html/OS/Linux/LinuxShell/8511.html