给出三种定义,方便大家理解shell。
Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。
Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。Ken Thompson 的 sh 是第一种 Unix Shell,Windows Explorer 是一个典型的图形界面 Shell。
Shell脚本解释器,用来解析shell语言,就是一个命令行解释器。(BASH是Shell的一种,是大多数LINUX发行版默认的SHELL,除BASH Shell外还有C Shell等其它类型的Shell。)
Linux严格意义上是一个操作系统,我们称为核心,但我们一般的用户是不能直接使用核心的,而是通过外壳程序。也就是shell,对比Windows,图形界面就是外壳程序。shell的简单定义就是命令行解释器,功能是将使用者的命令翻译给核心处理,同时将核心处理的结果翻译给使用者。可以看出shell主要是对我们的指令进行解析,解析指令给Linux内核;反馈结果在通过内核运行出结果,通过shell解析给用户。
Interactive(交互式)
shell的作用是解释执行用户的命令,用户输入一条命令,shell就解释执行一条。也就是平时我们使用的命令行语句。
Batch(批处理)
Batch是指用户实现写一个shell脚本(Scripts),其中很多条命令,让shell一次把这些命令执行完,而不必一条一条地敲命令。shell-batch脚本和编程语言很相似,也有变量和控制流程语句。但是shell脚本是解释执行的,不需要编译,shell程序从脚本中一行一行读取并执行这些命令,相当于用户吧脚本中的命令一行一行敲到shell提示符下执行(也即一行一行在Interactive中执行)。
另外,batch-shell在解释命令的时候并不是自己亲自执行,而是派生子进程让子进程去完成这项工作,这样的好处是把风险交给别人,当指令的执行出现问题时不会影响到shell(影响到其他指令的执行)。shell不可以挂,shell 一旦挂就没有什么可以解释命令了。对我们而言shell为了保证自己风险最低,通过创建子进程进行命令行的解释工作,而shell自己只要去等就可以了。
Shell 脚本(shell script),是一种为 shell 编写的脚本程序。 业界所说的 shell 通常都是指 shell 脚本,但读者朋友要知道,shell 和 shell script 是两个不同的概念。
cat /etc/shells
运行结果
bash由于易用和免费,在日常工作中被广泛使用。同时,Bash也是大多数Linux系统默认的Shell脚本解释器。
shell脚本头,#!/bin/sh与#!/bin/bash的区别
GNU/Linux操作系统中的/bin/sh本是bash (Bourne-Again Shell)的符号链接,但鉴于bash过于复杂,有人把bash从NetBSD移植到Linux并更名为dash Debian Almquist Shell),并建议将/bin/sh指向它(软链),以获得更快的脚本执行速度。Dash Shell 比Bash Shell小的多,符合POSIX标准。
sh一般设成bash的软链
在一般的linux系统当中(如redhat),使用sh调用执行脚本相当于打开了bash的POSIX标准模式
也就是说 /bin/sh 相当于 /bin/bash --posix
sh跟bash的区别,实际上就是bash有没有开启posix模式的区别
#!/bin/bash
echo "hello"
ls -al
在Linux命令输入./ test.sh时(需要加可执行权限)时,我们在这个文本文件开头指定了bash为默认的解释器,因此当前的交互式Shell会fork一个子进程,用bash解释器的代码去替换(也就是exec),而这个文本文件被当作是命令行参数传给这个子bash,等这个子bash执行完就会到我们的交互式bash了。
参考链接:
shell快速入门
shell脚本运行原理