[Powered by Google Translate] TOMMY：在这个视频中，我们将了解
重定向和管道。
到目前为止，我们一直在使用的功能，如printf来
输出到终端的数据和功能类似的GetString
以允许用户提供输入到我们的
程序中使用的键盘。
让我们赶紧来看看一个程序，得到了行
来自用户的输入，然后将其输出。
>> 在第7行，我们提示用户输入一个字符串，并
然后在第8行，我们要打印退了出去。
让编译和运行我们的程序。
大。
我们所提供的字符串被回
我们在终端。
这是因为printf函数的写信给
流称为标准输出，S-T-D-OUT。
当事情写入到标准输出，默认情况下，
显示由该终端。
>> 所以，这一切都很好，但如果，而不是简单地
显示字符串，我们希望将它保存到一个文件？
例如，我们可能要记得正是我们的
程序的时候，我们给了它一个特定的输入后。
有一种方法可以做到这一点在我们的C程序中，使用
写入文件的一些特殊功能，我们将
看到在另一个视频。
虽然，更容易，以某种方式将
重定向标准输出到一个文件中。
这样一来，当printf写入到stdout，其内容将
被写入文件，而不是
显示由该终端。
我们可以做到这一点，添加一个大于号，
一个文件名，命令，我们执行我们的程序。
>> 因此，而不是简单地执行。/重定向，我们可以
运行。/重定向，一个大于号，
名，例如file.txt的。
让我们看看会发生什么。
OK。
请注意，这时候，什么也没有显示在终端上，
但我们并没有修改的内容，我们
在所有的C程序。
现在，让我们来检查使用ls这个目录的内容。
>> 好的。
我们现在有一个新的名为file.txt的文件，在我们的目录，
这是我们提供的文件名，当我们运行我们的
重定向程序。
让我们打开file.txt的。
在这里，我们可以看到，标准输出重定向
写入文件名为file.txt的。
因此，让我们再次运行前面的命令，但提供一个
不同的输入时间。
好吧。
让我们来看看在file.txt的。
>> 在这里，我们可以看到该文件已被覆盖，所以我们
原来的输入是不存在了。
如果我们不是要追加到这个文件，把新的
输入下面的现有文件的内容，我们可以
使用两个大于符号，而不是只有一个。
让我们试试吧。
现在，如果我们再次打开file.txt的，我们可以看到我们的
输入线。
在某些情况下，我们可能要放弃任何
输出我们的计划。
而不是写输出到一个文件，然后删除
我们已经完成了它的文件时，我们可以写一个特殊的
文件名为​​/ dev / null的。
什么是写入/ dev/null--
或只是devnull短 -
它被自动丢弃。
因此，认为devnull的黑洞，为您的数据。
>> 所以，现在我们已经看到了如何用大于号可以重定向
标准输出，让我们看看如何可以重定向标准 -
或s-叔的d -
标准输出的模拟。
虽然功能同于printf写的流称为
从流中读取标准输出，的GetString和类似功能
称为stdin，默认情况下，是流
在键盘上输入的字符。
使用小于号，我们可以重定向标准输入，
一个文件名。
现在，而不是在提示用户输入
终端，程序将打开我们指定的文件，并使用
它的线条作为输入。
>> 让我们看看会发生什么。
大。
已打印的第一行file.txt的到终端
因为我们调用GetString的一次。
如果我们有另一个在我们的程序中调用GetString的，
file.txt的下一行已被用来作为
输入到该呼叫。
同样，我们没有改变我们的C程序在所有。
我们只是改变了我们运行它。
还记得，我们没有重定向标准输出时间，
所以输出的程序的时间是仍
显示在终端上。
当然，我们可以都重定向标准输入
和stdout是这样的。
现在，file2.txt包含file.txt的的第一行。
>> 因此，使用这些运营商，我们已经能够阅读和
写文本文件。
现在，让我们来看看如何，我们可以使用一个程序的输出
另一个程序的输入。
因此，这里是另一个简单的C程序，我
这里有名为hello.c。
正如你可以看到，这只是输出“嗨，
那里！“给用户。
如果我想重定向到使用作为输入输出的Hello -
另一种方案 -
我可以先输出重定向到一个文件名为hello的
INPUT.TXT，然后重定向标准输入重定向到相同的
文件 - INPUT.TXT。
所以我可以做。/你好INPUT.TXT。
按Enter键执行。
其次/重定向<
INPUT.TXT，并执行它。
因此，我们可以缩短这个有点用分号，这使得
我们在同一行上运行两个或多个命令。
所以我可以说，。/你好INPUT.TXT，分号，
/重定向<INPUT.TXT。
>> 所以这个作品，但它仍然感觉非常不雅。
我的意思是，我们真的需要这种中介的文本文件，该文件
重定向运行后，不再需要吗？
幸运的是，我们可以避免这种额外的文本文件，使用的是什么
称为管道。
如果我说/你好| /重定向，然后在标准输出
在左边的程序 -
在这种情况下，你好 -
将被用作标准输入
程序上的权利。
在这种情况下，重定向。因此，让我们运行这个。
>> 我们走吧。
我们可以看到，作为输入输出的Hello
为重定向。
拉丝命令一起使用管道，我们形成什么
所谓的管道，因为我们的产量基本上是移动
通过一个命令序列。
使用管道，我们可以做一些很酷的东西，而不需要
写任何代码。
例如，让我们说，我们想知道有多少文件
这个目录里面。
使用管道，我们可以将ls命令与WC -
或wordcount的 -
命令。
ls将输出到标准输出的目录中的每个文件，并
厕所会告诉我们有多少行，它通过标准输入。
所以，如果我们说LS WC-L -
到wc-l标志，告诉它计算行数 -
我们可以看到到底有多少文件
在当前目录中。
>> 因此，让我们来看看一个例子。
我这里有一个名为students.txt，
的名称的列表。
但是，这些名称都没有任何顺序，它的外观
像几个名字是重复的。
我们要的是一个唯一的名称列表按字母
为了保存到一个名为final.txt。
当然，我们可以写一个C程序来为我们做这。
但它会得到不必要的
复杂的很快。
让我们，而不是使用管道和一些内置的工具来解决
这个问题。
>> 我们需要做的第一件事情是读取该文件students.txt。
cat命令将做到这一点。
这将在指定的文件中读取和写入
其内容输出到stdout。
我们已经阅读过的文本文件后，我们会
要排序的名称。
sort命令可以处理给我们看。
的排序将输出线通过提供标准输入到标准输出（stdout）
在排序顺序。
为了提供内容students.txt
排序的stdin，我们可以使用一个管结合猫和排序。
所以，我可以执行cat students.txt的排序|和
然后按Enter键。
而现在，我们看到的内容students.txt
按字母顺序排列。
>> 所以，让我们添加另一个命令 -
uniq的，或独特的 -
我们的管道。
正如你可能已经猜到，uniq中，提供了一个排序序列
线通过标准输入，输出的独特线条。
所以现在我们有猫students.txt
|排序| uniq的。
最后，我们可以节省的管道输出到
猫students.txt |排序| uniq的文件通过
> final.txt。
所以，如果我们打开了final.txt的，我们有什么，我们
寻找：
唯一的名称按字母顺序排列的列表，
保存到一个文本文件中。
顺便说一下，我们也可以说排序<
students.txt | uniq的final.txt做到底
同样的事情，我们已经看到在使用每个运营商
这部影片。
>> 我的名字是汤米，这是CS50。