1700436130
UNIX传奇:历史与回忆 4.3 shell[3]
1700436131
1700436132
shell是运行其他程序的程序。它让用户运行命令,是用户和操作系统之间的主要接口。登录到Unix系统时,我的键盘连接到一个正在运行的shell实例。我可以输入命令,通常一次输入一个命令。shell依次运行每个命令,完成一个命令后,它就会为下一个命令做好准备。会话可能像下文这样,其中$是shell输出的提示,让我知道它在等我做点什么。我输入的内容以斜体字表示[4]。
1700436133
1700436134
$ date(告诉我当前日期和时间)
1700436135
Fri Oct 18 13:09:00 EDT 2019
1700436136
$ ls(列出目录内容)
1700436137
book.pdf book.txt
1700436138
$ wc book.txt (计算book.txt的行数、单词数和字符数)
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
[
上一页 ]
[ :1.700436129e+09 ]
[
下一页 ]