從http://www.cplusplus.com/reference/iostream/cout/:是標準輸出無處不在控制檯窗口?
默認情況下,大多數系統都有自己的標準輸出設置爲控制檯,其中文本消息顯示,儘管這通常被重定向。
我從來沒有聽說過系統,其中stdout
不是控制檯窗口,默認情況下或其他。我可以看到,在打印成本高昂的操作系統中,如何重定向它可能是有益的,但在現代計算機中這不應該成爲問題,對嗎?
從http://www.cplusplus.com/reference/iostream/cout/:是標準輸出無處不在控制檯窗口?
默認情況下,大多數系統都有自己的標準輸出設置爲控制檯,其中文本消息顯示,儘管這通常被重定向。
我從來沒有聽說過系統,其中stdout
不是控制檯窗口,默認情況下或其他。我可以看到,在打印成本高昂的操作系統中,如何重定向它可能是有益的,但在現代計算機中這不應該成爲問題,對嗎?
在大多數系統上,您可以將標準輸入/輸出/錯誤重定向到其他文件描述符或位置。
例如(在Unix):
./appname > output
重定向從應用程序的名字的標準輸出到名爲輸出文件。
./appname 2> errors > output
重定向stdout
到一個文件名爲輸出,並從stderr
名爲錯誤的文件的所有錯誤。
在UNIX系統上,你也可以有一個程序在stdin
打開文件描述符並將其指向,比如這個:
echo "input" > input
cat input | ./appname
這將導致程序從管道讀取stdin
。
這是如何在Unix中你可以「管」各種不同的工具一起創建一個更大的工具。
find . -type f | ./appname | grep -iv "search"
這將運行find
命令,並採取其輸出和管道將它導入./appname,然後appname
'的輸出將被髮送到grep
的輸入,然後搜索單詞‘搜索’,顯示只是匹配的結果。
它允許許多小公用事業有非常強大的影響。
想到>
,<
和|
像管道。
>
就像水槽裏的水槽,它接受數據並將其存儲在要放置的位置。當一個shell遇到>
它將會打開一個文件。
> file
當shell看到上面的,它會open
使用標準的系統調用的文件,並記住,文件描述符。在上面的例子中,因爲沒有輸入,它會創建一個空文件並允許你輸入更多的命令。
banner Hello
此命令在真正的大字母寫到您好控制檯,將導致它滾動(我在這裏使用的Unix,因爲它是我所知道的最好的)。輸出只是寫入標準輸出。使用「匯」(>
),我們可以控制輸出變,所以
banner Hello > bannerout
將導致所有從旗幟的標準輸出的數據重定向到文件描述符外殼已經打開,因此被寫入一個名爲bannerout
的文件。
管道的工作原理與>
類似,它們可以幫助控制數據流向。然而管道不能寫入文件,只能用於幫助數據流從一個點到另一個點。
例如,這裏是流過幾個變電站和用過的清洗水:
pump --from lake | treatment --cleanse-water | pump | reservoir | pump > glass
水從湖中流動,通過管道到水處理廠,從植物放回其移動的泵它到一個水庫,然後它再次被泵入市政水管,並通過你的水槽進入你的玻璃杯。
請注意,管道只是簡單地將所有輸出連接在一起,最終它會在玻璃杯中結束。
這與命令相同,並在Linux上的shell中處理它們。它也遵循一條獲得最終結果的途徑。
現在我還沒有在前面的陳述中討論過最後一件事,那就是<
輸入字符。它所做的是從文件讀取並將其輸出到程序的stdin。
cat < bannerout
只會打印存儲在bannerout中的內容。如果你有一個你想要處理的文件,可以使用它,但不想因爲不想在鏈中運行額外的命令而預先加上cat <file>
。
那麼試試這個:
echo "Hello" > bannerinput
banner < bannerinput
這將首先把字符串「Hello」的文件bannerinput
中,然後當你運行的旗幟它將從文件中讀取bannerinput
。
我希望這可以幫助你理解Unix上的重定向和切片是如何工作的(如果不是大多數情況下,它們也適用於Windows)。
我不確定我明白'''方法與'|'方法有什麼區別。 – Maxpm
>是一個重定向符號,它像一個水槽中的流水線,它將所有內容都放入提到的文件中。而| |是一個管道。它允許數據從一個進程的輸出流向另一個進程的輸入。 –
當然可以。我可能希望將標準重定向到文本文件,另一個進程,套接字,無論如何。
默認情況下它是控制檯,但是有很多重定向它的原因,最有用的(與Unix原理一致)是將一個程序的輸出重定向到另一個程序的輸入。這使得人們可以創建許多小型,輕量級的程序,這些程序可以作爲一個大型系統的分立部分進行工作。
基本上,它只是一個簡單而強大的共享數據的機制。由於我上面提到的原因,它在* nix系統上更受歡迎,但它也適用於Windows。
Windows和Linux將重定向stdout
到一個文件,如果你運行的程序是這樣的:
my_program > some_file
這是最常見的情況,但許多其他類型的重定向是可能的。在Linux上,您可以將stdout
重定向到支持「文件描述符」接口的任何內容,例如管道,套接字,文件和其他各種東西。
任何數量的事情都可能發生在三個標準文件描述符0,1和2上。任何人都可以啓動一個新的進程,並將文件描述符附加到他們喜歡的任何東西上。
例如,GNU屏幕將輸出放入管道中並允許動態重新連接會話。 SSH獲取輸出並將其返回到另一端。當然,所有的shell重定向器都經常使用操作文件描述符。
一個人可能想要重定向標準輸出的簡單例子是將信息傳遞給另一個程序時。 Unix/Linux命令ps
生成屬於當前用戶的進程列表。如果這個名單很長,你想搜索特定的過程中,你可以輸入
ps | grep thing
這會的ps
的stdout
重定向到的grep thing
的stdin
。
到目前爲止,所有的答案已經在調用程序的東西(shell,無論)的上下文中。該程序本身可以使stdout
以外的終端。 C標準庫提供了freopen
,它允許程序員在任何兼容環境中重定向stdout。 POSIX提供了許多其他機制(popen
,fdopen
,...),使程序員可以更加控制。我懷疑Windows提供了類似的機制。
要使程序擁有stdout
,它必須運行在託管實現(一個帶有操作系統),或獨立實現(帶有額外配件)上。
如果沒有某種控制檯,我很難找到這樣的實現,但假設火星漫遊器有一個完整的操作系統並且在C(或C++)中編程,並且沒有控制檯
/* 2001-07-15: JPL: stdout is the headquarters */
puts("Help. I'm stuck.");
可能已將消息發送到NASA總部。
在命令行中,我可以輸入類似於'program.exe> output.txt'的東西,並且'stdout'上的所有內容都將寫入'output.txt'而不是控制檯。 CGI腳本也是這樣工作的;該程序在'stdout'上寫出HTML,Web服務器將輸出傳遞給HTTP連接。 –
另外,'inetd'會將'stdin'和'stdout'連接到一個套接字。 –