简单的批处理任务

1. shell简介

操作系统对外提供的接口是“系统调用”,也就是一堆编程用的接口。这些接口一般以C函数的形式暴露给使用者。通过这些接口,开发者可以命令操作系统“启动一个进程”,“查找某个目录下的所有文件”,“将某个文件的权限配置为744”等等。

问题是我们平时使用电脑,不能每次都编写程序,再编译,再运行得到结果吧。比如你想知道一个目录下的所有文件,你肯定不会去写一段C代码,调用系统调用“readdir” (见http://www.man7.org/linux/man-pages/man3/readdir.3.html),然后gcc编译,然后运行。真这么干,一个最简单的工作也要耗费很长时间。况且,一个函数的返回是“数据结构”,或者输出到stdout或文件之类的地方。你总得以某种形式把结果“画”到界面上(不管是画字符还是画图片),才能查看那个结果。这个格式化输出的工作量也很大。

那么问题就来了,我们平时操作电脑,比如用网易云听音乐,用QQ发讯息,似乎没有调用这些接口?其实是网易云、QQ这些应用程序帮我们做了这些事情。但是这些应用软件功能都是很有限的,自由度很低,将用户与系统隔绝了。而Shell就可以看作一个自由度很高的应用程序。他有两个功能,解释器和调用系统功能。

正常人的思路是先写好程序,然后弄个交互的界面方便使用这个程序。只要使用者敲一组字符串,就可以调用之前写好的程序完成工作。比如我们会在命令行里输入“ls -Rl”这种字符串。这个字符串被翻译成“ls”,“-R”,“-l”。“ls”帮我们找到那个之前写好的程序,并启动它;“-R”和“-l”被作为参数传给这个程序,告诉程序走“递归所有子目录”+“输出长格式”这部分代码。

这个负责把用户输入的字符串转换到需要执行的程序,并把结果以某个形式画出来的东西,就叫做“Shell”,即帮你更方便使用操作系统接口的“壳”。这个词与操作系统内核(Kernel)对应。

在Linux中,bash负责按照某种格式把用户的输出的字符串翻译,比如对于普通非空字符翻译为程序和参数,并尝试去PATH里找对应的程序;对“空格”翻译成分隔符;对“$XXX”尝试进行环境变量的替换;对“|”翻译为管道;对 “>”翻译为输出重定向;对一个指令末尾的“&”翻译为将程序转到后台执行……

另一方面终端将stdout、stderr输出的东西画成我们可以看的一坨坨字符,包括字符、字体、颜色、换行、甚至响铃。

【bash】 + 【终端】大概可以理解为一个以字符为交互方式的“Shell”。

img
img

Shell的思想很普遍,并不一定限制在操作系统上。比如你自己写一个程序,有大量复杂的参数和配置。为了使用方便可以写个命令行工具将一个命令翻译成对这段程序的调用。你写的命令行工具就是你自己程序的“Shell”。比如写Java的同学肯定很熟悉mvn。一句mvn install可以产生出成百上千个下载、压缩、编译、清理、测试、上传等api的调用;使用数据库的同学也会用SQL来表达自己的查询,让数据库的“Shell”解释成对存储引擎各种api的调用。

简单来说,一个解释器加一个终端就构成了shell。解释器是如bash、zsh等东西,注意后面sh代表shell。

2. 终端和控制台

计算机早期阶段,一台主机只有一个控制台Consolo,用电传打印机(Teletypewritter简称tty)通过串口连接到主机。后来,在电传打印机基础上改进,用屏幕显示,叫做终端(Terimal)。

在Linux系统这个阶段,控制台和终端都是虚拟化的了,区别不大,基本可以看作是一样的。

  • tty,源自teletypewriter,电传打字机。现在被键盘与显示器取代,现在叫做终端比较合适,是一种字符型设备;
  • pty,伪终端,虚拟终端,pseudo-tty。

3. bat文件和sh文件

bat文件时dos下的批处理文件。批处理文件是无格式的文本文件,包含一条或多条命令。扩展名为.bat或者.cmd。利用批处理文件就可以简化日常或重复性任务。

sh文件是为shell编写的脚本程序。

这两种文件都是含有多条命令行指令,连续执行以实现一定功能。两种脚本语言不同,而这两种语言的系统也通常不同(win和linux)。

一般认为bat是在windows系统执行的文件,sh是在linux执行的批处理文件。

4. sh文件的不同执行方式

运行sh a.sh,表示我是用sh解释这个脚本,不要执行权限。

运行./a.sh,会查找脚本第一行是否指定了解释器,如果没制定,就用当前系统默认的shell。

1
2
#!/usr/bin/python
print("This is Python script")

比如上面就指定了python作为解释器。

参考资料

  1. Shell是用来解决什么问题的?