1700436139
9918 59395 362773 book.txt
1700436140
$ cp book.txt backup.txt(将book.txt复制到备份文件)
1700436141
1700436142
1700436143
重点说明:shell是个普通的用户程序,而非操作系统的组成部分,这也是从Multics中汲取的概念(也就是功能列表中提到的所谓“用户可选择系统命令语言”)。因为shell是用户程序,所以很容易用其他程序取代,这就是为什么有那么多Unix shell的原因。如果你不喜欢某个shell的工作方式,大可另择优者,甚至可以自己写个shell取而代之,所以shell并不特指哪个具体程序。
1700436144
也就是说,所有Unix shell都提供了相同的基本功能,通常也采用相同的语法。Unix shell最重要的功能是运行程序。它们也都提供了文件名通配符,像“*”这样的模式元字符会被扩展成符合模式的文件名列表。例如,要运行程序wc(word count,字数统计)来计算当前目录下所有名字以book开头的文件中的行数、字数和字符数,对应命令是:
1700436145
$ wc book*
1700436146
1700436147
1700436148
1700436149
1700436150
shell将模式book*扩展为当前目录中所有以book开头的文件名,并以这些文件名为参数运行wc。wc命令并不知道文件名列表是由模式指定的。重要的是,模式展开由shell执行,不必劳烦接收参数的程序。多年以来,微软的MS-DOS操作系统并不这样工作,有些程序做了自己的扩展,而另一些则没有,用户不能指望看到程序行为一致。
1700436151
1700436152
shell的另一主要服务是I/O重定向。如果程序被设计为从标准输入(默认为终端)读取,可以通过以下方法改从文件中读取:
1700436153
1700436154
$ program
1700436155
1700436156
1700436157
1700436158
1700436159
1700436160
如果它被设计为写到标准输出(同样,默认为终端),也可以被引导写入输出文件,如下所示:
1700436161
1700436162
$ program >outfile
1700436163
1700436164
1700436165
1700436166
1700436167
1700436168
如果目标文件尚不存在,就会被创建。与上述文件名扩展一样,程序不知道它的输入或输出被重定向。这是一种统一机制,由shell应用,而不是由单独的程序应用,并且比通过文件名参数指定文件输入和输出的方法更容易使用。以下是指定参数的方法示例:
1700436169
1700436170
$ program in=infile out=outfile
1700436171
1700436172
1700436173
1700436174
1700436175
1700436176
shell脚本(shell script)是存储在文件中的一系列命令。用该文件作为输入源,运行shell实例,如同直接输入命令一样运行脚本中的命令:
1700436177
1700436178
$ sh
1700436179
1700436180
1700436181
1700436182
1700436183
1700436184
脚本封装命令序列。例如,对于本书,我写了一系列简单的检查命令,查找拼写和标点符号错误、不正确的格式化命令和其他可能存在的失误。这些检查中的每一项都会运行一个程序。我可以一遍又一遍地重复输入这些命令,也可以把命令序列放在一个叫check的脚本文件中,运行check指令就能做检查。其他的脚本则能输出书页,还能做备份。
1700436185
1700436186
虽然这些脚本是专为我和这本书而编写,但它们实际上是一套新Unix命令。这类个人命令是shell脚本的常见用法,可以快速应用频繁的计算操作。我现在还在用一些三四十年前写的脚本,这在Unix的长期用户中一点也不稀奇。
1700436187
1700436188
使shell程序完全等同于编译后的程序的最后一步:如果文件被标记为可执行文件,它将被传递给shell执行。这样一来,shell脚本就成了“一等公民”,在执行时与编译后的程序没有区别:
[
上一页 ]
[ :1.700436139e+09 ]
[
下一页 ]