来自http://www.cplusplus.com/reference/iostream/cout/:
默认情况下,大多数系统都将其标准输出设置为控制台,其中显示了文本消息,但通常可以重定向.
我从来没有听说过一个系统,stdout除了控制台窗口之外,默认情况下也是如此.我可以看到如何重定向它在打印是一项昂贵的操作的系统中可能是有益的,但这在现代计算机中应该不是问题,对吧?
Ed *_* S. 14
当然可能是.我可能想要将标准重定向到文本文件,另一个进程,套接字等等.
默认情况下它是控制台,但是有多种原因可以重定向它,最有用的(与Unix哲学同步)是将一个程序的输出重定向到另一个程序的输入.这允许人们创建许多小的,轻量级的程序,这些程序相互馈送并作为较大系统的离散部分工作.
基本上,它只是一种简单而强大的共享数据机制.由于我上面提到的原因,它在*nix系统上更受欢迎,但它也适用于Windows.
在大多数系统上,您可以将标准输入/输出/错误重定向到其他文件描述符或位置.
例如(在Unix上):
./appname > output
Run Code Online (Sandbox Code Playgroud)
将stdout从appname重定向到名为output的文件.
./appname 2> errors > output
Run Code Online (Sandbox Code Playgroud)
重定向stdout到名为output的文件,并将所有错误重定向到名为errors stderr的文件.
在unix系统上,您还可以让程序打开文件描述符并指向它stdin,例如:
echo "input" > input
cat input | ./appname
Run Code Online (Sandbox Code Playgroud)
这将导致程序从管道中读取stdin.
这就是在unix中你可以将各种不同的实用程序"管道"在一起以创建一个更大的工具.
find . -type f | ./appname | grep -iv "search"
Run Code Online (Sandbox Code Playgroud)
这将运行find命令,并获取其输出并将其输入./appname,然后appname输出将被发送到grep输入,然后搜索单词"search",只显示匹配的结果.
它允许许多小型实用程序具有非常强大的效果.
想想的>,<和|类似管道.
>就像水槽中的排水管一样,它接受数据并将其存储在您想要放置的位置.当shell遇到>它时会打开一个文件.
> file
Run Code Online (Sandbox Code Playgroud)
当shell看到上面的内容时,它将open使用标准系统调用文件,并记住该文件描述符.在上述情况下,由于没有输入,它将创建一个空文件,并允许您键入更多命令.
banner Hello
Run Code Online (Sandbox Code Playgroud)
这个命令用非常大的字母将Hello写入控制台,并使其滚动(我在这里使用Unix,因为它是我最熟悉的).输出只是写入标准输出.使用"sink"(>),我们可以控制输出的位置,所以
banner Hello > bannerout
Run Code Online (Sandbox Code Playgroud)
将导致banner的标准输出中的所有数据重定向到shell打开的文件描述符,从而将其写入名为的文件bannerout.
管道的工作方式类似于>它们有助于控制数据流向的流程.但管道无法写入文件,只能用于帮助数据流从一个点到另一个点.
例如,这里有流经几个变电站的水和废物清洁:
pump --from lake | treatment --cleanse-water | pump | reservoir | pump > glass
Run Code Online (Sandbox Code Playgroud)
水从湖中流过,通过管道到达水处理厂,从工厂流回到将其移动到水库的泵,然后再次泵入市政水管并通过水槽进入玻璃.
请注意,管道只是将所有输出连接在一起,最终它最终会在您的玻璃杯中.
它与命令相同,并在Linux上的shell中处理它们.它还遵循了获得最终结果的途径.
现在有一个我在之前的陈述中尚未讨论过的最后一件事,那就是<输入字符.它的作用是从文件中读取并将其输出到程序上的stdin.
cat < bannerout
Run Code Online (Sandbox Code Playgroud)
将简单地打印存储在bannerout中的内容.如果您有要处理的文件,但cat <file>由于不想在链中运行额外的命令而不想预先添加,则可以使用此方法.
试试这个:
echo "Hello" > bannerinput
banner < bannerinput
Run Code Online (Sandbox Code Playgroud)
这将首先将字符串"Hello"放入文件中bannerinput,然后当您的运行横幅将从文件中读取时bannerinput.
我希望这可以帮助您了解重定向和解压缩在Unix上是如何工作的(如果不是大多数也将适用于Windows).