阅读 ‧ 电子书库 关于重定向的小问题
在Unix、Linux和DOS中,<两侧的空格都是可选的。有些系统(例如AmigaDOS)支持重定向,但在重定向符号和文件名之间不允许有空格。

下面是某个具体的words文件的运行示例;$是Unix和Linux的两个标准提示符之一。在DOS系统上,您会看到DOS提示符,可能是A>或C。

阅读 ‧ 电子书库

阅读 ‧ 电子书库

广告:个人专属 VPN,独立 IP,无限流量,多机房切换,还可以屏蔽广告和恶意软件,每月最低仅 5 美元

这样,我们看到了words程序的作用。

二、输出重定向

现在假设您希望echo_eof将您的键盘输入发送给一个名为mywords的文件。那么您可以输入下列命令并开始键入:

阅读 ‧ 电子书库

>是另一个重定向运算符。该运算符会导致建立一个名为mywords的新文件供您使用,然后将echo_eof的输出(也就是说,您键入的字符的副本)重定向到该文件。该重定向将stdout从显示设备(您的屏幕)重定向到mywords文件。如果您已经具有一个名为mywords的文件,则通常会删除该文件然后用新的文件代替之(不过,许多操作系统都允许您通过将文件设为只读来保护现有的文件)。您键入字母时在您的屏幕上出现的就是这些字母,并且它们的副本将保存到文件中。要结束程序,请在一行的开始键入Ctrl+D(Unix中)或Ctrl+Z(DOS中)。试着运行它。如果您不知道输入什么字符,只需模仿下面的例子。在该例中,我们使用Unix提示符$。记住要通过按下回车键来结束每行以向程序发送缓冲区内容。

阅读 ‧ 电子书库

处理Ctrl+D或Ctrl+Z之后,该程序终止,并返回到系统提示符下。程序是否工作了?Unix的ls命令或DOS的dir命令都可以列出文件名,它们会向您显示现有的mywords文件。您可以使用Unix和Linux的cat或DOS的type命令来查看文件内容,或者您可以再次使用echo_eof,但这次是将文件重定向至该程序:

阅读 ‧ 电子书库

三、组合重定向

现在假设您希望制作文件mywords的一个副本,并将其命名为savewords。只需发出下列命令:

阅读 ‧ 电子书库

就可完成这个动作。下面的命令同样可以实现这一功能,因为重定向运算符的顺序无关紧要:

阅读 ‧ 电子书库

注意不要对同一命令的输入和输出使用相同的文件名。

阅读 ‧ 电子书库

原因是>mywords使原始的mywords文件在用于输入之前长度被截短为零。

简单地说,下面是在Unix、Linux或DOS下使用两个重定向运算符<和>所遵循的规则:

● 重定向运算符将一个可执行(executable)程序(包括标准的操作系统命令)与一个数据文件连接起来。该运算符不能用于一个数据文件与另一个数据文件的连接,也不能用于一个程序与另一个程序的连接。
● 使用这些运算符时,输入不能来自一个以上的文件,输出也不能定向至一个以上的文件。
● 除了偶尔在使用到一些对Unix shell、Linux shell或DOS具有特殊意义的字符时,名字和操作符之间的空格并不是必需的。例如,我们可以使用echo_eof<words。

您已经看到了若干个正确的例子。表8.1中是一些错误的例子,其中addup和count是可执行程序,fish和beets是文本文件:

表8.1 错误使用重定向的例子

 

 

fish>beets 违反第一条规则
addup<count 违反第一条规则
addup<fish<beets 违反第二条规则
count>beets fish 违反第二条规则

Unix、Linux和DOS还具有»运算符,该运算符可使您向一个现有文件的末尾追加数据;还有管道运算符 (1),它可以将一个程序的输出与第二个程序的输入连接起来。要了解所有这些运算符的详细信息,请参阅有关Unix的书籍,例如UNIX System Management Primer Plus(Jeffery; Sams Publishing) [1]

四、注释

重定向使您能够把键盘输入程序用于文件。要使其工作,该程序必须能够检测文件尾。例如,第7章介绍了一个统计字数的程序,该程序统计到第一个‘I’字符为止的单词数。将ch从char类型变为int类型,并在循环判断中用EOF替换‘l’,这样您就可以使用该程序统计文本文件中的单词数了。

重定向是一个命令行概念,因为您要通过在命令行键入特殊符号来指示它。如果您不在使用命令行环境,您仍可以尝试这一技术。首先,一些集成环境具有菜单选项,使您可以指明重定向。其次,对Windows系统来说,您可以打开一个DOS窗口并从命令行运行可执行文件。默认情况下,Microsoft Visual C++7.1将可执行文件放在一个名为Debug的子文件夹中。文件名会具有与工程名称相同的名字,并使用.exe作为扩展名。对Codewarrior来说,使用Win 32 Console App模式;默认情况下该模式将可执行文件命名为Cproj Debug.exe(其中的Cproj代表您的项目名称),并将其放在工程文件夹中。

如果重定向不能工作,您可以尝试让程序直接打开文件。程序清单8.3显示了带有简单注释的一个例子。详细内容您将在第13章中学习到。

程序清单8.3 file_eof.c程序

阅读 ‧ 电子书库