shell是一种命令行解释器
对于一般用户,我们不能直接使用操作系统(kernel)。而是通过 kernel的“外壳”程序,也就是所谓的shell,来与kernel沟通。
为什么不能直接使用kernel?
从 技 术 角 度 , Shell 的 最 简 单 定 义 : 命 令 行 解 释 器(command Interpreter)
主要包含:
a. 将使用者的命令翻译给核心(kernel)处理。
b. 同时,将核心的处理结果翻译给使用者。
对于windows GUI,我们操作windows 不是直接操作windows内核,而是通过图形接口,点击,从而完成我们的操作(比如如进入D盘的操作,我们通常是双击D盘盘符. 或者运行一个应用程序)。shell 对于Linux,有相同的作用,主要是对我们的指令进行解析,解析指令给Linux内核。反馈结果在通过内核运用出结果,通过shell解析给用户。
shell的普遍作用
UNIX的shell程序解释用户的命令, Shell脚本是解释型的,而不是编译型的。除了向内核传送命令之外, shell的主要任务是提供一个可单独配置的使用shell资源配置文件的用户环境。
shell任务的一个重要部分是搜索命令。 Bash是按照下一的步骤来完成的:检查命令是否包含斜杠。如果没有,首先检查函数列表是否包含一个我们寻找的命令。如果命令不是一个函数,那么在内建命令列表中检查。shell内建命令是指bash(或其它版本)工具集中的命令。一般都会有一个与之同名的系统命令,比如bash中的echo命令与/bin/echo是两个不同的命令,尽管他们行为大体相仿。当在bash中键入一个命令时系统会先看他是否是一个内建命令,如果不是才会查看是否是系统命令或第三方工具。所以在bash中键入echo命令实际上执行bash工具集中的bash命令也就是内建命令,而不是/bin/echo这个系统命令。备注: Linux中的type命令如果命令既不是函数也不是内建命令,那么扫描列在 PATH 中的目录列表来进行查找。 Bash使用一个 hashtable ( 内存中的数据存放区域) 来记忆可执行文件的完整路径,这样能防止对 PATH 的扩展搜索。如果搜索没有成功, Bash打印一条错误消息并返回退出状态127。如果搜索成功或者命令包含一个斜杠, shell在一个单独执行环境中执行这个命令。如果因为文件是不可执行的或者不是一个目录造成执行失败,就假设是一个shell脚本。如果命令是异步开始的, shell会等待命令完成并收集它的退出状态。
shell如何运行程序。shell用fork建立新进程,用execv函数簇在新进程中运行用户指定的程序,最后shell用wait命令等待新进程结束。 wait系统调用同时从内核取得退出状态或者信号序号以告知子进程是如何结束的。shell输出一个提示符,等待你输入一行命令,然后执行这个命令。待此命令执行终止,shell随后输出一个提示符,等待下一个输入的命令行。
以hello.c程序为例。首先,shell程序执行它的指令,等待我们输入命令。当我们在键盘上输入字符串”./hello“后,shell程序就逐一读取字符到寄存器,再把它存放到存储器中。当我们在键盘上敲回车时,shell就知道我们已经结束了命令的输入。然后shell执行一系列指令,这些指令将hello目标文件中的代码和数据从磁盘拷贝到主存,从而加载hello文件。数据包括最终会被输出的字符串”hello,world\n“。shell加载和执行hello程序,然后等待程序终止,hello程序在屏幕上输出他的信息,然后终止。shell随后输出一个提示符,等待下一个输入的命令行。