输入 https://www.e-learn.cn/tag/shuru zh-hans linux shell数据重定向(输入重定向与输出重定向)详细分析 https://www.e-learn.cn/topic/2520634 <span>linux shell数据重定向(输入重定向与输出重定向)详细分析</span> <span><span lang="" about="/user/33" typeof="schema:Person" property="schema:name" datatype="">被刻印的时光 ゝ</span></span> <span>2019-12-16 21:10:45</span> <div class="field field--name-body field--type-text-with-summary field--label-hidden field--item"> <p class="ad-wrap"> <a data-traceid="blog_detail_above_text_link_1" data-tracepid="blog_detail_above_text_link" style="color:#A00; font-weight:bold;" href="https://my.oschina.net/u/2663968/blog/3135425" target="_blank" rel="nofollow">【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) &gt;&gt;&gt; <img align="absmiddle" style="max-height: 32px;max-width: 32px;margin-top: -4px;" class="b-lazy" data-src="https://www.oschina.net/img/hot3.png" data-original="https://www.oschina.net/img/hot3.png" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /></a> </p> <p> <span></span> </p> <p> <b>导读小文:【<a href="http://www.cnblogs.com/chengmo/archive/2010/10/20/1855805.html" rel="nofollow"></a><a href="http://www.ibm.com/developerworks/cn/linux/l-iotips/" rel="nofollow">http://www.ibm.com/developerworks/cn/linux/l-iotips/</a>】</b> </p> <p> <span></span><span style="line-height:1.5;font-size:10pt;"><strong>技巧:Linux I/O重定向的一些小技巧</strong></span> </p> <p> <span style="line-height:1.5;font-size:10pt;">简介: Linux I/O 重定向虽然很简单,但在脚本编写、系统管理时却要常常打交道,搞清其中使用技巧非常有用。</span><span></span> </p> <p> <span style="font-size:10pt;line-height:1.5;">首先说一下什么是I/O重定向,所谓I/O重定向简单来说就是一个过程,这个过程捕捉一个文件,或者命令,程序,脚本,甚至脚本中的代码块(code block)的输出,然后把捕捉到的输出,作为输入发送给另外一个文件,命令,程序,或者脚本。</span> </p> <span style="font-size:10pt;line-height:1.5;">标准输入通常指键盘的输入 </span> <br /> 标准输出通常指显示器的输出  <br /><p> 标准错误通常也是定向到显示器 </p> <p> <span style="font-size:10pt;line-height:1.5;">#</span><strong>ls /dev 1&gt;filename   </strong><span style="font-size:10pt;line-height:1.5;">                               </span><span style="font-size:10pt;line-height:1.5;background-color:#E53333;">#注意:"1"和"&gt;"中间没有空格</span> </p> 以上命令会把命令的标准输出重新定向到一个文件filename,而不是显示到屏幕上,如果不指明文件标识符, <span style="background-color:#E53333;">系统默认的就是1, 因此1可以省略</span> <br /><span style="background-color:#E56600;">如果把上面例子重的"&gt;"改成"&gt;&gt;"则表示把输出追加到filename文件的末尾</span>,如果文件不存在则创建它。如下 <br /> # <strong>ls /dev &gt;&gt;filename</strong> <br /><br /> # <strong>ls -qw  /dev  2&gt;filename     :<span>把标准错误重新定向到文件</span></strong> <br /><br /><p> <strong>#</strong><strong>ls /dev &amp;&gt;filename </strong><strong>    :</strong><strong>"&amp;"在这里代表标准输出和标准错误</strong><strong>,这里无论是正常输出还是错误信息都写到filename中了。</strong> </p> <strong>重新定义文件标识符可以用i&gt;&amp;j命令,表示把文件标识符i重新定向到j,<span style="background-color:#E53333;">你</span><span style="background-color:#E53333;">可以把"&amp;"理解为"取地址"</span></strong> <br /><p> 请看以下例子 </p> <p> <strong>#exec 5&gt;&amp;1</strong><span style="font-size:10pt;line-height:1.5;"><strong>    :</strong><strong>表示把文件标识符5定向到标准输出,</strong></span><span style="font-size:10pt;line-height:1.5;background-color:#FFE500;"><strong>这个命令通常用来临时保存标准输入</strong></span><span style="font-size:10pt;line-height:1.5;background-color:#FFE500;"><strong>。</strong></span> </p> <p> <span style="font-size:10pt;line-height:1.5;"><strong>"&amp;-"表示关闭文件标识符</strong></span> </p> 有关关闭文件标识符的操作请参考下面 <br /> n&lt;&amp;- 关闭输入文件标识符n <br /><strong>0&lt;&amp;-或&lt;&amp;- 关闭标准输入stdin</strong> <br /> n&gt;&amp;- 关闭输出文件标识符n <br /><strong>1&gt;&amp;-或&gt;&amp;-关闭标准输出stdout</strong> <br /><br /><span></span> <strong><span style="background-color:#FF9900;">:&gt; filename 或者 &gt; filename</span></strong> <br /><span></span> 表示把文件filename设置成空,也就是清空文件内容,如果文件不存在,则创建一个空文件(等同于touch命令)。:表示一个空输出,两个命令的唯一区别就是&gt;filename不是在所有shell都可以正常工作的。 <br /><p> <br /></p> <p> </p> <ul><li> <span style="line-height:1.5;font-size:10pt;">经常需要将输出显示在屏幕同时还要输出到一个文件中,可以例如:</span> </li> <li> <span style="line-height:1.5;font-size:10pt;">make 2&gt;&amp;1 | tee m.txt</span> </li> <li> <span style="line-height:1.5;font-size:10pt;"><span style="background-color:#FF9900;">tee将标准输入复制到每个指定文件,并显示到标准输出。</span><br /><span style="font-size:10pt;line-height:1.5;">-a, --append 内容追加到给定的文件而非覆盖</span><br /> -i, --ignore-interrupts 忽略中断信号<br /><div> <br /></div> <br /></span> </li> </ul><p></p> <br /><p> <br /></p> <h2> <a href="http://www.cnblogs.com/chengmo/archive/2010/10/20/1855805.html" rel="nofollow">linux shell数据重定向(输入重定向与输出重定向)详细分析</a> </h2> <p> <br /></p> <p> 在了解重定向之前,我们先来看看linux 的文件描述符。<span></span> </p> <p> <strong>linux文件描述符</strong>:可以理解为linux跟踪打开文件,而分配的一个数字,这个数字有点类似c语言操作文件时候的句柄,通过句柄就可以实现文件的读写操作。 用户可以自定义文件描述符范围是:3-num,这个最大数字,跟用户的:ulimit –n 定义数字有关系,不能超过最大值。<span style="line-height:1.5;font-size:14px;"> </span> </p> <p> linux启动后,会默认打开3个文件描述符,分别是:标准输入standard input 0,正确输出standard output 1,错误输出:error output 2 </p> <p> 以后打开文件后。新增文件绑定描述符 可以依次增加。 一条shell命令执行,都会继承父进程的文件描述符。因此,所有运行的shell命令,都会有默认3个文件描述符。<span style="line-height:1.5;font-size:14px;"> </span> </p> <p> 对于任何一条linux 命令执行,它会是这样一个过程: </p> <p> <a href="http://images.cnblogs.com/cnblogs_com/chengmo/WindowsLiveWriter/linuxshell_EB66/image_2.png" rel="nofollow"><img title="image" height="184" alt="image" width="548" border="0" class="b-lazy" data-src="http://static.oschina.net/uploads/img/201303/06232312_eXLu.png" data-original="http://static.oschina.net/uploads/img/201303/06232312_eXLu.png" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /></a> </p> <p> 一个命令执行了: </p> <p> 先有一个输入:输入可以从键盘,也可以从文件得到 </p> <p> 命令执行完成:成功了,会把成功结果输出到屏幕:<span></span>standard output默认是屏幕<span></span> </p> <p> 命令执行有错误:会把错误也输出到屏幕上面:standard error默认也是指的屏幕<span style="line-height:1.5;font-size:14px;"> </span> </p> <p> 文件输入输出由追踪为一个给定的进程所有打开文件的整数句柄来完成。这些数字值就是文件描述符。最为人们所知的文件米描述符是 <em>stdin</em>, <em>stdout</em> 和 <em>stderr</em>,文件描述符的数字分别是0,1和2。这些数字和各自的设备是保留的。一个命令执行前,先会准备好所有输入输出,默认分别绑定(stdin,stdout,stderr),如果这个时候出现错误,命令将终止,不会执行。命令解析过程,可以参考:<a href="http://www.cnblogs.com/chengmo/archive/2010/10/17/1853344.html" rel="nofollow">Linux Shell 通配符、元字符、转义符使用实例介绍</a> </p> <p> 这些默认的输出,输入都是linux系统内定的,我们在使用过程中,有时候并不希望执行结果输出到屏幕。我想输出到文件或其它设备。这个时候我们就需要进行输出重定向了。 </p> <p> linux shell下常用输入输出操作符是: </p> <p> <span></span><strong>1.  标准输入   (stdin) :代码为 0 ,使用 &lt; 或 &lt;&lt; ; /dev/stdin -&gt; /proc/self/fd/0   0代表:/dev/stdin </strong><br /><strong>2.  标准输出   (stdout):代码为 1 ,使用 &gt; 或 &gt;&gt; ; /dev/stdout -&gt; /proc/self/fd/1  1代表:/dev/stdout</strong><br /><strong>3.  标准错误输出(stderr):代码为 2 ,使用 2&gt; 或 2&gt;&gt; ; /dev/stderr -&gt; /proc/self/fd/2 2代表:/dev/stderr</strong> </p> <p> <span></span>  </p> <ul><li> <strong>输出重定向:</strong> </li> </ul><blockquote> <p> <strong>格式:</strong> </p> <p> <span></span><span style="background-color:#FF9900;">command-line1 [1-n] &gt; file或文件操作符或设备</span> </p> <p> <span></span>上面命令意思是:将一条命令执行结果(标准输出,或者错误输出,本来都要打印到屏幕上面的)  重定向其它输出设备(文件,打开文件操作符,或打印机等等)1,2分别是标准输出,错误输出。 </p> <p> <strong>实例:</strong> </p> <div> <div> <div> <span style="line-height:1.5;"><a href="http://www.cnblogs.com/chengmo/archive/2010/10/20/1855805.html#" rel="nofollow">?</a></span> </div> <table border="0" cellpadding="0" cellspacing="0" style="border:1px solid #C0C0C0;width:972.7272338867188px;height:auto !important;margin:0px !important;padding:0px !important;font-family:'Courier New', Consolas, 'Bitstream Vera Sans Mono', Courier, monospace !important;font-size:12px !important;"><tbody><tr><td style="border:1px solid #C0C0C0;font-family:'Courier New', Consolas, 'Bitstream Vera Sans Mono', Courier, monospace !important;vertical-align:baseline !important;color:#AFAFAF !important;"> <div> 1 </div> <div> 2 </div> <div> 3 </div> <div> 4 </div> <div> 5 </div> <div> 6 </div> <div> 7 </div> <div> 8 </div> <div> 9 </div> <div> 10 </div> <div> 11 </div> <div> 12 </div> <div> 13 </div> <div> 14 </div> <div> 15 </div> <div> 16 </div> <div> 17 </div> <div> 18 </div> <div> 19 </div> <div> 20 </div> <div> 21 </div> <div> 22 </div> <div> 23 </div> <div> 24 </div> <div> 25 </div> <div> 26 </div> <div> 27 </div> <div> 28 </div> <div> 29 </div> <div> 30 </div> <div> 31 </div> <div> 32 </div> <div> 33 </div> <div> 34 </div> <div> 35 </div> <div> 36 </div> <div> 37 </div> <div> 38 </div> </td> <td style="border:1px solid #C0C0C0;font-family:'Courier New', Consolas, 'Bitstream Vera Sans Mono', Courier, monospace !important;vertical-align:baseline !important;"> <div> <div> #显示当前目录文件 test.sh test1.sh test1.sh实际不存在 </div> <div> [chengmo@centos5 shell]$ls test.sh test1.sh </div> <div> ls: test1.sh: 没有这个文件和目录 </div> <div> test.sh </div> <div>   </div> <div> #正确输出与错误输出都显示在屏幕了,现在需要把正确输出写入suc.txt </div> <div> # 1&gt;可以省略,不写,默认所至标准输出 </div> <div> [chengmo@centos5 shell]$ls test.sh test1.sh 1&gt;suc.txt </div> <div> ls: test1.sh: 没有这个文件和目录 </div> <div> [chengmo@centos5 shell]$cat suc.txt </div> <div> test.sh </div> <div>   </div> <div> #把错误输出,不输出到屏幕,输出到err.txt </div> <div> [chengmo@centos5 shell]$ls test.sh test1.sh 1&gt;suc.txt 2&gt;err.txt </div> <div> [chengmo@centos5 shell]$cat suc.txt err.txt </div> <div> test.sh </div> <div> ls: test1.sh: 没有这个文件和目录 </div> <div> #继续追加把输出写入suc.txt err.txt  “&gt;&gt;”追加操作符 </div> <div> [chengmo@centos5 shell]$ls test.sh test1.sh 1&gt;&gt;suc.txt 2&gt;&gt;err.txt </div> <div>   </div> <div> #将错误输出信息关闭掉 </div> <div> [chengmo@centos5 shell]$ls test.sh test1.sh 2&gt;&amp;- </div> <div> test.sh </div> <div> [chengmo@centos5 shell]$ls test.sh test1.sh 2&gt;/dev/null </div> <div> test.sh </div> <div> #&amp;[n] 代表是已经存在的文件描述符,&amp;1 代表输出 &amp;2代表错误输出 &amp;-代表关闭与它绑定的描述符 </div> <div> #/dev/null 这个设备,是linux 中黑洞设备,什么信息只要输出给这个设备,都会给吃掉 </div> <div>   </div> <div> #关闭所有输出 </div> <div> [chengmo@centos5 shell]$ls test.sh test1.sh  1&gt;&amp;- 2&gt;&amp;- </div> <div> #关闭 1 ,2 文件描述符 </div> <div> [chengmo@centos5 shell]$ls test.sh test1.sh  2&gt;/dev/null 1&gt;/dev/null </div> <div> #将1,2 输出转发给/dev/null设备 </div> <div> [chengmo@centos5 shell]$ <span style="background-color:#FFE500;">ls test.sh test1.sh &gt;/dev/null 2&gt;&amp;1</span> </div> <div> <span style="background-color:#FFE500;">#将错误输出2 绑定给 正确输出 1,然后将 正确输出 发送给 /dev/null设备  这种常用</span> </div> <div> &lt;p&gt;[chengmo@centos5 shell]$ls test.sh test1.sh &amp;&gt;/dev/null </div> <div> #&amp; 代表标准输出 ,错误输出 将所有标准输出与错误输出 输入到/dev/null文件 </div> <div> &lt;/p&gt; </div> </div> </td> </tr></tbody></table></div> </div> <p>  <span></span><span style="line-height:1.5;font-size:9pt;"> </span> </p> <p> <strong>注意:</strong> </p> <p> <span style="background-color:#FFE500;">1、shell遇到”&gt;”操作符,会判断右边文件是否存在,如果存在就先删除,并且创建新文件。不存在直接创建。 无论左边命令执行是否成功。右边文件都会变为空。</span> </p> <p> 2、“&gt;&gt;”操作符,判断右边文件,如果不存在,先创建。以添加方式打开文件,会分配一个文件描述符[不特别指定,默认为1,2]然后,与左边的标准输出(1)或错误输出(2) 绑定。 </p> <p> <span style="background-color:#FFE500;">3、当命令:执行完,绑定文件的描述符也自动失效。0,1,2又会空闲。</span> </p> <p> 4、一条命令启动,命令的输入,正确输出,错误输出,默认分别绑定0,1,2文件描述符。 </p> <p> 5、一条命令在执行前,先会检查输出是否正确,如果输出设备错误,将不会进行命令执行 </p> </blockquote> <ul><li> <strong>输入重定向</strong> </li> </ul><blockquote> <p> <strong><span style="line-height:1.5;background-color:#FFFFFF;">格式:</span></strong> </p> <p> <span style="background-color:#FF9900;">command-line [n] &lt;file或文件描述符&amp;设备</span> </p> <p> 将然有,命令默认从键盘获得的输入,改成从文件,或者其它打开文件以及设备输入。执行这个命令,将标准输入0,与文件或设备绑定。将由它进行输入。 </p> <p> <strong>实例:</strong> </p> <div> <span style="line-height:1.5;"><a href="http://www.cnblogs.com/chengmo/archive/2010/10/20/1855805.html#" rel="nofollow">?</a></span> </div> <table border="0" cellpadding="0" cellspacing="0" style="border:1px solid #C0C0C0;width:972.7272338867188px;height:auto !important;margin:0px !important;padding:0px !important;font-family:'Courier New', Consolas, 'Bitstream Vera Sans Mono', Courier, monospace !important;font-size:12px !important;"><tbody><tr><td style="border:1px solid #C0C0C0;font-family:'Courier New', Consolas, 'Bitstream Vera Sans Mono', Courier, monospace !important;vertical-align:baseline !important;color:#AFAFAF !important;"> <div> 1 </div> <div> 2 </div> <div> 3 </div> <div> 4 </div> <div> 5 </div> <div> 6 </div> <div> 7 </div> <div> 8 </div> <div> 9 </div> <div> 10 </div> <div> 11 </div> <div> 12 </div> <div> 13 </div> <div> 14 </div> <div> 15 </div> <div> 16 </div> </td> <td style="border:1px solid #C0C0C0;font-family:'Courier New', Consolas, 'Bitstream Vera Sans Mono', Courier, monospace !important;vertical-align:baseline !important;"> <div> [chengmo@centos5 shell]# cat &gt; catfile </div> <div> testing </div> <div> cat file test </div> <div> #这里按下 [ctrl]+d 离开 </div> <div> #从标准输入【键盘】获得数据,然后输出给catfile文件 </div> <div>   </div> <div> [chengmo@centos5 shell]$cat&gt;catfile &lt;test.sh </div> <div> #cat 从test.sh 获得输入数据,然后输出给文件catfile </div> <div>   </div> <div>   </div> <div> <span style="background-color:#DFC5A4;">[chengmo@centos5 shell]$cat&gt;catfile &lt;&lt;eof</span> </div> <div> test afile </div> <div> test! </div> <div> eof </div> <div>   </div> <p> <span style="background-color:#DFC5A4;">#&lt;&lt; 这个连续两个小符号, 他代表的是『结束的输入字符』的意思。</span> </p> <p> <span style="background-color:#DFC5A4;">#这样当空行输入eof字符,输入自动结束,不用ctrl+D</span> </p> <div> <span></span> </div> </td> </tr></tbody></table></blockquote> <p> <span></span>  </p> <p>   </p> <ul><li> <strong>exec绑定重定向</strong> </li> </ul><blockquote> <p> <span style="line-height:1.5;background-color:#FFFFFF;"><strong>格式:</strong></span> </p> <p> exec 文件描述符[n] &lt;或&gt; file或文件描述符或设备 </p> <p> 在上面讲的输入,输出重定向 将输入,输出绑定文件或设备后。只对当前那条指令是有效的。如果需要在绑定之后,接下来的所有命令都支持的话。就需要用exec命令 </p> <p> <strong>实例:</strong> </p> <div> <div> <div> <span style="line-height:1.5;"><a href="http://www.cnblogs.com/chengmo/archive/2010/10/20/1855805.html#" rel="nofollow">?</a></span> </div> <table border="0" cellpadding="0" cellspacing="0" style="border:1px solid #C0C0C0;width:972.7272338867188px;height:auto !important;margin:0px !important;padding:0px !important;font-family:'Courier New', Consolas, 'Bitstream Vera Sans Mono', Courier, monospace !important;font-size:12px !important;"><tbody><tr><td style="border:1px solid #C0C0C0;font-family:'Courier New', Consolas, 'Bitstream Vera Sans Mono', Courier, monospace !important;vertical-align:baseline !important;color:#AFAFAF !important;"> <div> 1 </div> <div> 2 </div> <div> 3 </div> <div> 4 </div> <div> 5 </div> <div> 6 </div> <div> 7 </div> <div> 8 </div> <div> 9 </div> <div> 10 </div> <div> 11 </div> <div> 12 </div> <div> 13 </div> <div> 14 </div> <div> 15 </div> <div> 16 </div> <div> 17 </div> <div> 18 </div> <div> 19 </div> <div> 20 </div> <div> 21 </div> <div> 22 </div> </td> <td style="border:1px solid #C0C0C0;font-family:'Courier New', Consolas, 'Bitstream Vera Sans Mono', Courier, monospace !important;vertical-align:baseline !important;"> <div> <div> <span style="background-color:#FF9900;">[chengmo@centos5 shell]$exec 6&gt;&amp;1</span> </div> <div> <span style="background-color:#FF9900;">#将标准输出与fd 6绑定</span> </div> <div> <span style="background-color:#FF9900;"> </span> </div> <div> <span style="background-color:#FF9900;">[chengmo@centos5 shell]$ls  /proc/self/fd/ </span> </div> <div> <span style="background-color:#FF9900;">0  1  2  3  6</span> </div> <div> <span style="background-color:#FF9900;">#出现文件描述符6</span> </div> <div> <span style="background-color:#FF9900;"> </span> </div> <div> <span style="background-color:#FF9900;">[chengmo@centos5 shell]$exec 1&gt;suc.txt</span> </div> <div> <span style="background-color:#FF9900;">#将接下来所有命令标准输出,绑定到suc.txt文件(输出到该文件)</span> </div> <div> <span style="background-color:#FF9900;"> </span> </div> <div> <span style="background-color:#FF9900;">[chengmo@centos5 shell]$ls -al</span> </div> <div> <span style="background-color:#FF9900;">#执行命令,发现什么都不返回了,因为标准输出已经输出到suc.txt文件了</span> </div> <div> <span style="background-color:#FF9900;"> </span> </div> <div> <span style="background-color:#FF9900;">[chengmo@centos5 shell]$exec 1&gt;&amp;6</span> </div> <div> <span style="background-color:#FF9900;">#恢复标准输出</span> </div> <div> <span style="background-color:#FF9900;"> </span> </div> <div> <span style="background-color:#FF9900;"> </span> </div> <div> <span style="background-color:#FF9900;">[chengmo@centos5 shell]$exec 6&gt;&amp;-</span> </div> <div> <span style="background-color:#FF9900;">#关闭fd 6描述符</span> </div> <div> <span style="background-color:#FF9900;"> </span> </div> <div> <span style="background-color:#FF9900;">[chengmo@centos5 ~]$ls /proc/self/fd/</span> </div> <div> <span style="background-color:#FF9900;">0  1  2  3</span> </div> </div> </td> </tr></tbody></table></div> </div> <p> 说明:使用前先将标准输入保存到文件描述符6,这里说明下,文件描述符默认会打开0,1,2 还可以使用自定义描述符 。然后对标准输出绑定到文件,接下来所有输出都会发生到文件。 使用完后,恢复标准的输出,关闭打开文件描述符6。 </p> <p> <strong><span style="background-color:#E56600;color:#000000;font-size:16px;">【我的理解:</span></strong><span style="color:#000000;font-size:16px;line-height:16.363636016845703px;background-color:#E56600;"><strong>&amp;1表示</strong></span><strong><span style="background-color:#E56600;color:#000000;font-size:16px;">输出符1的地址,所以“exec 6&gt;&amp;1”即是将6描述符重定向到1描述符的地址(标准输出地址</span></strong><strong><span style="background-color:#E56600;color:#000000;font-size:16px;">),于是6的地址也就是系统中标准输出的地址;然后将1描述符重定向到文件:“</span></strong><strong><span style="background-color:#E56600;color:#000000;font-size:16px;">exec 1&gt;suc.txt”;之后又将1定向到6的地址:“</span></strong><strong><span style="background-color:#E56600;color:#000000;font-size:16px;">exec 1&gt;&amp;6</span></strong><strong><span style="background-color:#E56600;color:#000000;font-size:16px;">”;最后禁用6描述符,也就是删除6描述符的指向,这个指向之前被定义指到标准输出地址,这个地址是不变的,如果之前不利用6来接替1的指向,后面想1指回标准输出地址就很难办到了</span></strong><strong><span style="background-color:#E56600;color:#000000;font-size:16px;">。</span></strong><strong><span style="background-color:#E56600;color:#000000;font-size:16px;">】</span></strong> </p> <p> <strong>有趣事情:</strong> </p> <p> 可能有朋友会这样用:exec 1&gt;suc.txt ,接下来所有输出都绑定到suc.txt 文件,那么怎么样恢复原来的呢? 试试你就会发现问题所在…… </p> </blockquote> <ul><li> <strong>复杂一点实例</strong> </li> </ul><blockquote> <div> <div> <div> <span style="line-height:1.5;"><a href="http://www.cnblogs.com/chengmo/archive/2010/10/20/1855805.html#" rel="nofollow">?</a></span> </div> <table border="0" cellpadding="0" cellspacing="0" style="border:1px solid #C0C0C0;width:972.7272338867188px;height:auto !important;margin:0px !important;padding:0px !important;font-family:'Courier New', Consolas, 'Bitstream Vera Sans Mono', Courier, monospace !important;font-size:12px !important;"><tbody><tr><td style="border:1px solid #C0C0C0;font-family:'Courier New', Consolas, 'Bitstream Vera Sans Mono', Courier, monospace !important;vertical-align:baseline !important;color:#AFAFAF !important;"> <div> 1 </div> <div> 2 </div> <div> 3 </div> <div> 4 </div> <div> 5 </div> <div> 6 </div> <div> 7 </div> <div> 8 </div> <div> 9 </div> <div> 10 </div> <div> 11 </div> </td> <td style="border:1px solid #C0C0C0;font-family:'Courier New', Consolas, 'Bitstream Vera Sans Mono', Courier, monospace !important;vertical-align:baseline !important;"> <div> <div> exec 3&lt;&gt;test.sh; </div> <div> #打开test.sh可读写操作,与文件描述符3绑定 </div> <div>   </div> <div> <span style="background-color:#FFE500;">while read line&lt;&amp;3</span> </div> <div>  do </div> <div> <span style="background-color:#FFE500;">    echo $line;</span> </div> <div> done </div> <div> #循环读取文件描述符3(读取的是test.sh内容) </div> <div> exec 3&gt;&amp;- </div> <div> exec 3&lt;&amp;- </div> <div> #关闭文件的,输入,输出绑定 </div> </div> </td> </tr></tbody></table></div> </div> <p>   </p> </blockquote> <ul><li> <strong>总结下:</strong> </li> </ul><blockquote> <p> 学习就要总结,总结才可以提高了。哈哈! </p> <p> 估计还有一些朋友是头晕晕的。怎么linux的重定向这么复杂呢,又是文件打开描述符又是读,还有些,还有默认标准输入输出。 </p> <p> 其实,总结一下,重定向应用通常就以下两点: </p> <p> 1、重新设置命令的默认输入,输出,指向到自己文件(文件,文件描述符,设备其实都是文件,因为linux就是基于设备也是文件,描述符也指向是文件,哈哈) </p> <p> 2、扩展自己新的描述符,对文件进行读写操作 </p> </blockquote> <p> <br /></p> <p> <br /></p> <p> <br /></p> <div class="alert alert-success" role="alert"><p>来源:<code>oschina</code></p><p>链接:<code>https://my.oschina.net/u/616377/blog/112168</code></p></div></div> <div class="field field--name-field-tags field--type-entity-reference field--label-above"> <div class="field--label">标签</div> <div class="field--items"> <div class="field--item"><a href="/tag/shell" hreflang="zh-hans">shell</a></div> <div class="field--item"><a href="/tag/zhongdingxiang" hreflang="zh-hans">重定向</a></div> <div class="field--item"><a href="/tag/shuru" hreflang="zh-hans">输入</a></div> <div class="field--item"><a href="/taxonomy/term/79022" hreflang="zh-hans">&lt;</a></div> <div class="field--item"><a href="/taxonomy/term/79023" hreflang="zh-hans">&gt;</a></div> </div> </div> Mon, 16 Dec 2019 13:10:45 +0000 被刻印的时光 ゝ 2520634 at https://www.e-learn.cn C语言基础学习基本数据类型-变量的输出与输入 https://www.e-learn.cn/topic/2125383 <span>C语言基础学习基本数据类型-变量的输出与输入</span> <span><span lang="" about="/user/243" typeof="schema:Person" property="schema:name" datatype="">折月煮酒</span></span> <span>2019-12-10 16:51:52</span> <div class="field field--name-body field--type-text-with-summary field--label-hidden field--item"> <p><strong>变量的输出</strong></p> <p>变量如何输入输出呢?实际上,在这之前你已经使用过输出语句(printf语句)了,我们可以使用printf来执行输出。</p> <p>printf语句的使用方法如下:</p> <pre><code class="language-objectivec">printf(格式控制字符串, 数据1, 数据2, 数据3.......);</code></pre> <p>格式控制字符串用特定的<strong>格式说明符</strong>代表输出的数据类型,这里的数据可以是变量、常量或者结果值具有合适类型的表达式。</p> <p>之前看到的符号%d有什么作用呢?如下这段代码:</p> <pre><code class="language-objectivec">int a = 1;   int b = 2;   int c = 3;   printf("%d,%d,%d", a, b, c);  </code></pre> <p>我们运行后在屏幕的输出结果是: 1,2,3</p> <p>你会发现,屏幕输出的是a、b、c的值。哈!原来%d就是一个格式说明符,当这一行输出时,其作用是指出输出a、b、c的值。%d用于输出int类型的值。事实上 每一种数据都有自己的说明符。后面在学到新的数据类型时,也会说到与之相应的说明符。</p> <p>要特别注意的是,不要忘记给每一个想输出的项目都使用一个格式说明符。</p> <p>举个实例:</p> <p><img alt="" height="714" width="460" class="b-lazy" data-src="http://static.oschina.net/uploads/space/2016/0819/093339_1azI_2814141.png" data-original="http://static.oschina.net/uploads/space/2016/0819/093339_1azI_2814141.png" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" /></p> <p><strong>变量的输入</strong></p> <p>scanf( )函数是C语言中最常用的一个输入函数。scanf语句的使用方法:</p> <pre><code class="language-objectivec">scanf(格式说明字符串,变量地址1, 变量地址2, 变量地址3......);  </code></pre> <p>scanf()函数接受你<strong>在键盘的输入</strong>,把你在键盘输入的文本转成各种形式,如整数,浮点数,字符或者字符串。而printf( )是把各种形式的数据转换成在屏幕上显示的文本。也就是说,scanf()是printf( )的逆操作:</p> <pre><code class="language-objectivec">#include&lt;stdio.h&gt;       int main(void)     {      int a;     //定义一个int型变量a             scanf("%d", &amp;a);   //从键盘读取一个数并赋值给a          printf("%d\n", a);  //输出变量a的值             return 0;   }  </code></pre> <p>在上面这段程序中,当编译器运行到scanf语句时,程序会等待键盘的输入,此时你可以输入一个值,编译器便会将其赋给变量a,然后通过printf语句在屏幕上输出变量a的值。<br /> scanf()函数用到指向变量的指针,我们会在第四章中学到关于指针的具体内容。现在我们只要知道,如果使用scanf()来读取一个之前定义过的基本变量类型的值,记得在变量前加上&amp;。</p> <p><strong>更多学习内容,就在码芽网http://www.mayacoder.com/lesson/index</strong></p> <div class="alert alert-success" role="alert"><p>来源:<code>oschina</code></p><p>链接:<code>https://my.oschina.net/u/2814141/blog/734907</code></p></div></div> <div class="field field--name-field-tags field--type-entity-reference field--label-above"> <div class="field--label">标签</div> <div class="field--items"> <div class="field--item"><a href="/tag/cyuyan" hreflang="zh-hans">c语言</a></div> <div class="field--item"><a href="/tag/shuru" hreflang="zh-hans">输入</a></div> <div class="field--item"><a href="/tag/shuchu" hreflang="zh-hans">输出</a></div> <div class="field--item"><a href="/tag/printf" hreflang="zh-hans">printf</a></div> <div class="field--item"><a href="/tag/scanf" hreflang="zh-hans">scanf</a></div> </div> </div> Tue, 10 Dec 2019 08:51:52 +0000 折月煮酒 2125383 at https://www.e-learn.cn