<blockquote><p>在linux中,stream是数据流的意思,就是按一定顺序读取的一串数据,所以数据流的方向就是数据流的读取顺序。Linux系统把数据读取后输出的结果导入到其他文件中的过程称为重定向数据流。Linux下输入一段命令并运行以后,屏幕里会显示两种结果:运行成功结果即标准输出、运行失败结果即标准错误输出;如果不做处理,它们都会显示在屏幕上,而通过数据流重定向就可将其储存到其他的文件中。</p></blockquote>
<p><img src="https://img.php.cn/upload/article/202303/17/2023031709544952034.jpg" alt="linux中stream什么意思" ></p>
<p>本教程操作环境:linux7.3系统、Dell G3电脑。</p>
<p><strong>在linux中,stream是数据流的意思。</strong></p>
<h2><strong>stream(数据流)是什么意思</strong></h2>
<p>stream(数据流)就是按一定顺序读取的一串数据,所以数据流的方向就是数据流的读取顺序。</p>
<p>数据流最初是通信领域使用的概念,代表传输中所使用的信息的数字编码信号序列。这个概念最初在1998年由Henzinger在文献87中提出,他将数据流定义为“只能以事先规定好的顺序被读取一次的数据的一个序列”。</p>
<p>Linux系统重定向数据流就是把数据读取后输出的结果导入到其他文件中。</p>
<h2><strong>Linux数据流重定向</strong></h2>
<p>数据流重定向简单来说就是将某条命令的输入数据来源或输出数据定位到其他的文件。Linux下一切皆文件。这里的文件可以是设备文件、普通文件等。</p>
<p><a id="1_stdin_stdout_stderr_5"></a><span style="font-size: 18px;"><strong>1、stdin stdout stderr</strong></span></p>
<blockquote><p><code>stdin</code>:标准输入。指的是为命令运行所提供的一些信息。<br><code>stdout</code>:标准输出。指的是命令执行所返回的正确信息。<br><code>stderr</code>:标准错误输出。指的是命令执行失败后所返回的错误信息。</p></blockquote>
<p>这三者与命令的关系通常如下:</p>
<div class="mermaid sequence-diagram"><svg id="mermaid-svg-43Q0mtxvjga7WpCa" width="100%" xmlns="http://www.w3.org/2000/svg" height="158" style="max-width: 436.46875px;" viewbox="0 0 436.46875 158"><style>#mermaid-svg-43Q0mtxvjga7WpCa {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-43Q0mtxvjga7WpCa .error-icon{fill:#552222;}#mermaid-svg-43Q0mtxvjga7WpCa .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-43Q0mtxvjga7WpCa .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-43Q0mtxvjga7WpCa .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-43Q0mtxvjga7WpCa .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-43Q0mtxvjga7WpCa .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-43Q0mtxvjga7WpCa .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-43Q0mtxvjga7WpCa .marker{fill:#333333;stroke:#333333;}#mermaid-svg-43Q0mtxvjga7WpCa .marker.cross{stroke:#333333;}#mermaid-svg-43Q0mtxvjga7WpCa svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-43Q0mtxvjga7WpCa .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-43Q0mtxvjga7WpCa .cluster-label text{fill:#333;}#mermaid-svg-43Q0mtxvjga7WpCa .cluster-label span{color:#333;}#mermaid-svg-43Q0mtxvjga7WpCa .label text,#mermaid-svg-43Q0mtxvjga7WpCa span{fill:#333;color:#333;}#mermaid-svg-43Q0mtxvjga7WpCa .node rect,#mermaid-svg-43Q0mtxvjga7WpCa .node circle,#mermaid-svg-43Q0mtxvjga7WpCa .node ellipse,#mermaid-svg-43Q0mtxvjga7WpCa .node polygon,#mermaid-svg-43Q0mtxvjga7WpCa .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-43Q0mtxvjga7WpCa .node .label{text-align:center;}#mermaid-svg-43Q0mtxvjga7WpCa .node.clickable{cursor:pointer;}#mermaid-svg-43Q0mtxvjga7WpCa .arrowheadPath{fill:#333333;}#mermaid-svg-43Q0mtxvjga7WpCa .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-43Q0mtxvjga7WpCa .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-43Q0mtxvjga7WpCa .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-43Q0mtxvjga7WpCa .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-43Q0mtxvjga7WpCa .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-43Q0mtxvjga7WpCa .cluster text{fill:#333;}#mermaid-svg-43Q0mtxvjga7WpCa .cluster span{color:#333;}#mermaid-svg-43Q0mtxvjga7WpCa div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-43Q0mtxvjga7WpCa :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}</style>
<g><g class="output"><g class="clusters"></g><g class="edgePaths"><g class="edgePath LS-A LE-B" style="opacity: 1;" id="L-A-B"><path class="path" d="M54.40625,79L61.493489583333336,79C68.58072916666667,79,82.75520833333333,79,96.9296875,79C111.10416666666667,79,125.27864583333333,79,132.36588541666666,79L139.453125,79" marker-end="url(#arrowhead34)" style="fill:none"></path><defs><marker id="arrowhead34" viewbox="0 0 10 10" refx="9" refy="5" markerunits="strokeWidth" markerwidth="8" markerheight="6" orient="auto"><path d="M 0 0 L 10 5 L 0 10 z" class="arrowheadPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"></path></marker></defs></g><g class="edgePath LS-B LE-C" style="opacity: 1;" id="L-B-C"><path class="path" d="M229.451171875,56L237.5322265625,51.833333333333336C245.61328125,47.666666666666664,261.775390625,39.333333333333336,277.8069661458333,35.166666666666664C293.8385416666667,31,309.7395833333333,31,317.6901041666667,31L325.640625,31" marker-end="url(#arrowhead35)" style="fill:none"></path><defs><marker id="arrowhead35" viewbox="0 0 10 10" refx="9" refy="5" markerunits="strokeWidth" markerwidth="8" markerheight="6" orient="auto"><path d="M 0 0 L 10 5 L 0 10 z" class="arrowheadPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"></path></marker></defs></g><g class="edgePath LS-B LE-D" style="opacity: 1;" id="L-B-D"><path class="path" d="M229.451171875,102L237.5322265625,106.16666666666667C245.61328125,110.33333333333333,261.775390625,118.66666666666667,277.8069661458333,122.83333333333333C293.8385416666667,127,309.7395833333333,127,317.6901041666667,127L325.640625,127" marker-end="url(#arrowhead36)" style="fill:none"></path><defs><marker id="arrowhead36" viewbox="0 0 10 10" refx="9" refy="5" markerunits="strokeWidth" markerwidth="8" markerheight="6" orient="auto"><path d="M 0 0 L 10 5 L 0 10 z" class="arrowheadPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"></path></marker></defs></g></g><g class="edgeLabels"><g class="edgeLabel" style="opacity: 1;" transform="translate(96.9296875,79)"><g transform="translate(-17.5234375,-13)" class="label"><rect rx="0" ry="0" width="35.046875" height="26"></rect><foreignobject width="35.046875" height="26"><div style="display: inline-block; white-space: nowrap;">
<span id="L-L-A-B" class="edgeLabel L-LS-A' L-LE-B">stdin</span>
</div></foreignobject></g></g><g class="edgeLabel" style="opacity: 1;" transform="translate(277.9375,31)"><g transform="translate(-21.453125,-13)" class="label"><rect rx="0" ry="0" width="42.90625" height="26"></rect><foreignobject width="42.90625" height="26"><div style="display: inline-block; white-space: nowrap;">
<span id="L-L-B-C" class="edgeLabel L-LS-B' L-LE-C">stderr</span>
</div></foreignobject></g></g><g class="edgeLabel" style="opacity: 1;" transform="translate(277.9375,127)"><g transform="translate(-22.703125,-13)" class="label"><rect rx="0" ry="0" width="45.40625" height="26"></rect><foreignobject width="45.40625" height="26"><div style="display: inline-block; white-space: nowrap;">
<span id="L-L-B-D" class="edgeLabel L-LS-B' L-LE-D">stdout</span>
</div></foreignobject></g></g></g><g class="nodes"><g class="node default" style="opacity: 1;" id="flowchart-A-18" transform="translate(31.203125,79)"><rect rx="5" ry="5" x="-23.203125" y="-23" width="46.40625" height="46" class="label-container"></rect><g class="label" transform="translate(0,0)"><g transform="translate(-13.203125,-13)"><foreignobject width="26.40625" height="26"><div style="display: inline-block; white-space: nowrap;">File</div></foreignobject></g></g></g><g class="node default" style="opacity: 1;" id="flowchart-B-19" transform="translate(184.84375,79)"><rect rx="5" ry="5" x="-45.390625" y="-23" width="90.78125" height="46" class="label-container"></rect><g class="label" transform="translate(0,0)"><g transform="translate(-35.390625,-13)"><foreignobject width="70.78125" height="26"><div style="display: inline-block; white-space: nowrap;">Command</div></foreignobject></g></g></g><g class="node default" style="opacity: 1;" id="flowchart-C-21" transform="translate(377.0546875,31)"><rect rx="5" ry="5" x="-51.4140625" y="-23" width="102.828125" height="46" class="label-container"></rect><g class="label" transform="translate(0,0)"><g transform="translate(-41.4140625,-13)"><foreignobject width="82.828125" height="26"><div style="display: inline-block; white-space: nowrap;">Screen/File</div></foreignobject></g></g></g><g class="node default" style="opacity: 1;" id="flowchart-D-23" transform="translate(377.0546875,127)"><rect rx="5" ry="5" x="-51.4140625" y="-23" width="102.828125" height="46" class="label-container"></rect><g class="label" transform="translate(0,0)"><g transform="translate(-41.4140625,-13)"><foreignobject width="82.828125" height="26"><div style="display: inline-block; white-space: nowrap;">Screen/File</div></foreignobject></g></g></g></g></g></g></svg></div>
<p>在Linux环境下,我们输入一段命令并运行以后,屏幕里会显示两种结果:运行成功结果即标准输出、运行失败结果即标准错误输出。</p>
<ul style="list-style-type: disc;">
<li><p>标准输出(STDOUT): Standard output,指的是命令执行所返回的正确信息。</p></li>
<li><p>标准错误输出(STDERR): Standard error output,指的是命令执行所返回的错误信息。</p></li>
</ul>
<p>如果不对STDOUT和STDERR做处理,他们都会显示在屏幕上,通过数据流重定向就可以将其储存到其他的文件中,而将其储存在文件中的特殊字符有:</p>
<ul style="list-style-type: disc;">
<li><p>标准输入stin:代码为0,使用<code><</code>或<code><<</code></p></li><li><p>标准输出stout:代码为1,使用<code>></code>或<code>>></code></p></li>
<li><p>标准错误输出stderr:代码为2,使用<code>2></code>或<code>2>></code></p></li>
</ul>
<p><a id="2__21"></a><span style="font-size: 18px;"><strong>2、数据流重定向的使用</strong></span></p>
<ul><li>
<code>stdout</code>:标准输出重定向。这里重定向的是正确输出。</li></ul>
<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">find / -name '.bashrc' > ~/out_right</pre><div class="contentsignin">登录后复制</div></div>
<p>该命令将正确输出定向输入到文件<code>~/out_right</code>。如果<code>~/out_right</code>不存在,则自动创建。因为没对错误信息处理,错误输出默认输出到屏幕终端上,此时终端只会显示错误输出。</p>
<ul><li>
<code>stderr</code>:标准错误输出重定向。这里重定向的是错误输出。</li></ul>
<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">find / -name '.bashrc' 2> ~/out_error</pre><div class="contentsignin">登录后复制</div></div>
<p>该命令将错误输出定向输入到文件<code>~/out_error</code>。如果<code>~/out_error</code>不存在,则自动创建。因为没对正确信息处理,正确输出默认输出到屏幕终端上,此时终端只会显示正确输出(如果没找到指定文件,屏幕没有输出)。</p>
<ul><li>
<code>stdin</code>:一般使用标准输入来替换键盘输入。</li></ul>
<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">cat > catfile < ~/.bashrc</pre><div class="contentsignin">登录后复制</div></div><p><code>cat</code>命令后不接任何参数,cat会从键盘读取数据。使用标准输入,将输入来源定向到文件<code>~/.bashrc</code>。然后通过<code>>将标准输出定位到<code>catfile</code>文件。<code>cat</code>是查看文件的命令,这里直接读取文件<code>~/.bashrc</code>然后将其输出到<code>catfile</code>。<p><a id="3_2_47"></a><span style="font-size: 18px;"><strong>3、</strong><code><strong>>>,2>>,<<</strong></code></span></p><ul><li><code>>></strong></code>(<strong>累加</strong>):附加标准输出。<code>cmd > file1</code>,命令<code>cmd</code>将<code>stdout</code>输出到<code>file1</code>中,如果<code>fiel1</code>此前存在,且有数据,那么<code>file1</code>会事先被清空,然后写入<code>stdout</code>。而使用命令<code>cmd >> file1</code>,不会预先清空<code>file1</code>文件,而是直接在文件末尾加上输入的数据。<li>
<code>2>></code>(<strong>累加</strong>):附加标准错误输出。与<code>>></code>相似。</li>
<li>
<code><<</code>(<strong>指定结束关键字</strong>):后接<code>结束的输入字符</code>。关键字必须独占一行,否则无效。</li></ul>38bc79e9635f97138f8bc06dfef28877<p>实现方法不止一种,我们取较好理解的写法<code>find / -name .bashrc > list 2>&1</code>。这段代码中的<code>2>&1</code>可以理解为,将标准错误输出(代码为2)重定向为标准输出(代码为1)。然后<code>> list</code>将标准输出重定向到文件<code>list</code>。因为标准错误输出被定向为标准输出,所以最后所有输出都被定向到文件<code>list</code>中。</li></span></p><p>相关推荐:《<a href="http://www.php.cn/course/list/33.html" target="_blank">Linux视频教程</a>》</p></pre>
以上是linux中stream什么意思的详细内容。更多信息请关注PHP中文网其他相关文章!