从今天开始,我们就来详细的认识一下到底什么是 shell,它在 Linux 系统中有什么作用。Windows 系统上也有 powershell,但是并不常用,那到了 Linux 系统上,shell 为什么就如此的受欢迎,而且是每个 Linux 用户都必须掌握的知识呢?
shell是什么
当我们谈到命令行时,我们实际上是指 shell。 shell是一个程序,它从键盘读取命令然后交由操作系统来执行。几乎所有 Linux 发行版都提供了一个名为 GNU Project 的 shell 程序。“bash”是“Bourne Again SHell”首字母缩写,bash 是 sh 的增强版本,sh 史蒂夫·伯恩(Steve Bourne)编写的原始 Unix shell 程序。
Shell跟标准的编程语言区别很大,它基本上是一个面向字符串的编程语言
shell脚本格式
一个规范的Shell脚本在第一行会指出由哪个程序(解释器)来执行脚本中的内容,这一行内容在Linux bash的编程一般为:
/#!/bin/bash
或
/#!/bin/sh
注意:
(1)在Shell中如果一行的第一个字母是#,则是注释,但是上面两个是写在第一行,所以不是脚本注释行,如果写在某个命令之后,则变成注释行。
(2)sh为bash的软链接,大多数情况下,脚本的开头使用“#!/bin/bash”和“#!/bin/sh”是没有区别的,但更规范的写法是在脚本的开头使用“#!/bin/bash”。
shell脚本执行
赋予执行权限,直接运行
chmod 755 hello.sh
./hellp.sh
通过Besh调用执行脚本
bash hello.sh
这是我在知乎看到的一篇文章有助于理解shell
https://www.zhihu.com/question/309875771/answer/664294297
Shell 是什么
Shell其实就是字面意思--壳. 一个系统有内核(Kernel)自然就有外壳(Shell). 在 Linux 上广义的 Shell 就是与用户交互的界面, 图形化界面是 Shell, 命令行界面也是 Shell. 狭义上的 Shell 就是 Linux 上的命令行界面. 一般发行版上的命令行界面是 bash, 而 debian 的是 dash. 下面的讨论基于侠义的 Shell.
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) 这个系统调用.
其他语言不也能方便的与计算机进行交互吗?
其他语言与计算机交互也是直接或间接的通过系统调用来完成. 很多语言的系统调用是通过库的形式封装了. 如 python 的 os.mkdir(), 就是封装了 mkdir(char* path, int access) 系统调用. 当然python 也可以使用subprocess.call('mkdir xxx')
调用外部的 mkdir 程序实现, 这基本就是 Shell 的做法.
那么到底哪个效率更高呢?
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 语言实现就是鸡和鸡蛋的关系.