[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。