|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
如果您觉得本篇CentOSLinux教程讲得好,请记得点击右边漂浮的分享程序,把好文章分享给你的小伙伴们!nux重定向是指修正本来默许的一些器材,对本来体系下令的默许实行体例举行改动,好比说复杂的我不想看到在显现器的输入而是但愿输入到某一文件中就能够经由过程Linux重定一直举行这项事情。 Linux默许输出是键盘,输入是显现器。你能够用重定一直改动这些设置。好比用wc下令的时分原本是要手动输出一篇笔墨来盘算字符数的,用了重定向后能够间接把一个已写好的文件用‘<’指向这条下令,就间接能够统计这个文件的字符数等了。输入也是一样,你能够把屏幕输入重定向到一个文件里,再到文件里往看了局。重定向操纵符能够用来将下令输出和输入数据流从默许地位重定向到其他地位,其输出或输入数据流的地位称为句柄;罕见的句柄有三种,固然句柄能够自行扩大,一样平常的OS都供应相似的功效。句柄句柄代号句柄形貌
STDIN0键盘输出
STDOUT1输入信息到提醒符窗口
STDERR2输入毛病信息到提醒符窗口
默许的<重定向输出操纵符是0,而默许的>重定向输入操纵符是1。键进<或>操纵符以后,必需指定命据的读写地位,能够是文件名或其他现有的句柄。
要指定重定向到现有句柄,请利用与&字符,前面接要重定向的句柄号(即&句柄号)。
比方,上面的下令能够将句柄2(即STDERR)重定向到句柄1(即STDOUT):2>&1
下表列出了可用于重定向输出和输入数据流的操纵符:
Linux重定向操纵符功效形貌
>将下令输入写进文件或装备,而不是下令提醒符或句柄
<从文件而不是从键盘或句柄读进下令输出
>>将下令输入增加到文件开端而不删除文件中已有的信息
>&将一个句柄的输入写进到另外一个句柄的输出中
<&从一个句柄读取输出并将其写进到另外一个句柄输入中
|从一个下令中读取输入并将其写进另外一个下令的输出中;也称为管道操纵符
如今我们回过火来看看下面的那条语句mysh>mylog.txt2>&1便可分明:
>mylog.txt意义是将尺度输入重定向到mylog.txt,等价于mysh1>mylog.txt;
2>&1意义是将毛病输入重定向到句柄1尺度输入;综合起来就是mysh下令实行过程当中发生的尺度输入和毛病输入城市被重定向到mylog.txt中;
重定向的功效非常壮大,有乐趣的能够往实验各类分歧的组合,看看前后地位变下会有甚么了局?
某些时分我们大概其实不但愿纪录甚么尺度输入大概是毛病输入,那能够用mysh>null2>null大概mysh>/dev/null2>/dev/null;
I/O重定向详解
1、基础观点(这是了解前面的常识的条件,请务必了解)
a、I/O重定向一般与FD有关,shell的FD一般为10个,即0~9;
b、经常使用FD有3个,为0(stdin,尺度输出)、1(stdout,尺度输入)、2(stderr,尺度毛病输入),默许与keyboard、monitor、monitor有关;
c、用<来改动读进的数据信道(stdin),使之从指定的档案读进;
d、用>来改动送出的数据信道(stdout,stderr),使之输入到指定的档案;
e、0是<的默许值,因而<与0<是一样的;同理,>与1>是一样的;
f、在IO重定向中,stdout与stderr的管道会先筹办好,才会从stdin读进材料;
g、管道“|”(pipeline):上一个下令的stdout接到下一个下令的stdin;
h、tee下令是在不影响底本I/O的情形下,将stdout复制一份到档案往;
i、bash(ksh)实行下令的历程:剖析下令-变量求值-下令替换(``和$())-重定向-通配符睁开-断定路径-实行下令;
j、()将commandgroup置于sub-shell往实行,也称nestedsub-shell,它有一点十分主要的特征是:承继父shell的Standardinput,output,anderrorplusanyotheropenfiledescriptors。
k、exec下令:经常使用来替换以后shell偏重新启动一个shell,换句话说,并没有启动子shell。利用这一下令时任何现有情况都将会被扫除。exec在对文件形貌符举行操纵的时分,也只要在这时候,exec不会掩盖你以后的shell情况。
2、基础IO
cmd>file把stdout重定向到file文件中;
cmd>>file把stdout重定向到file文件中(追加);
cmd1>fiel把stdout重定向到file文件中;
cmd>file2>&1把stdout和stderr一同重定向到file文件中;
cmd2>file把stderr重定向到file文件中;
cmd2>>file把stderr重定向到file文件中(追加);
cmd>>file2>&1把stderr和stderr一同重定向到file文件中(追加);
cmd<file>file2cmd下令以file文件作为stdin,以file2文件作为stdout;
catfile以读写的体例翻开file;
cmd<filecmd下令以file文件作为stdin;
cmd<<delimiterHeredocument,从stdin中读进,直至碰到delimiter分界符。
3、进阶IO
>&n利用体系挪用dup(2)复制文件形貌符n并把了局用作尺度输入;
<&n尺度输出复制自文件形貌符n;
<&-封闭尺度输出(键盘);
>&-封闭尺度输入;
n<&-暗示将n号输出封闭;
n>&-暗示将n号输入封闭;
上述一切情势都能够前导一个数字,此时创建的文件形貌符由这个数字指定而不是缺省的0或1。如:
...2>file运转一个下令并把毛病输入(文件形貌符2)定向到file。
...2>&1运转一个下令并把它的尺度输入和输入兼并。(严厉的说是经由过程复制文件形貌符1来创建文件形貌符2,但效果一般是兼并了两个流。)
我们对2>&1具体申明一下:2>&1也就是FD2=FD1,这里并非说FD2的值即是FD1的值,由于>是改动送出的数据信道,也就是说把FD2的“数据输入通道”改成FD1的“数据输入通道”。假如仅仅如许,这个改动仿佛没有甚么感化,由于FD2的默许输入和FD1的默许输入原本都是monitor,一样的!可是,当FD1是其他文件,乃至是其他FD时,这个就具有特别的用处了。请人人务必了解这一点。
exec0exec1>outfilename#翻开文件outfilename作为stdout。
exec2>errfilename#翻开文件errfilename作为stderr。
exec0<&-#封闭FD0。
exec1>&-#封闭FD1。
exec5>&-#封闭FD5。
[plain]viewplaincopy
- 1COMMAND_OUTPUT>
- 2#重定向stdout到一个文件.
- 3#假如没有这个文件就创立,不然就掩盖.
- 4
- 5ls-lR>dir-tree.list
- 6#创立一个包括目次树列表的文件.
- 7
- 8:>filename
- 9#>会把文件"filename"截断为0长度.
- 10#假如文件不存在,那末就创立一个0长度的文件(与touch的效果不异).
- 11#:是一个占位符,不发生任何输入.
- 12
- 13>filename
- 14#>会把文件"filename"截断为0长度.
- 15#假如文件不存在,那末就创立一个0长度的文件(与touch的效果不异).
- 16#(与上边的":>"效果不异,可是在某些shell下大概不克不及事情.)
- 17
- 18COMMAND_OUTPUT>>
- 19#重定向stdout到一个文件.
- 20#假如文件不存在,那末就创立它,假如存在,那末就追加到文件后边.
- 21
- 22
- 23#单行重定向下令(只会影响它们地点的行):
- 24#--------------------------------------------------------------------
- 25
- 261>filename
- 27#重定向stdout到文件"filename".
- 281>>filename
- 29#重定向并追加stdout到文件"filename".
- 302>filename
- 31#重定向stderr到文件"filename".
- 322>>filename
- 33#重定向并追加stderr到文件"filename".
- 34&>filename
- 35#将stdout和stderr都重定向到文件"filename".
- 36
- 37#==============================================================================
- 38#重定向stdout,一次一行.
- 39LOGFILE=script.log
- 40
- 41echo"Thisstatementissenttothelogfile,"$LOGFILE"."1>$LOGFILE
- 42echo"Thisstatementisappendedto"$LOGFILE"."1>>$LOGFILE
- 43echo"Thisstatementisalsoappendedto"$LOGFILE"."1>>$LOGFILE
- 44echo"Thisstatementisechoedtostdout,andwillnotappearin"$LOGFILE"."
- 45#每行事后,这些重定向下令会主动"reset".
- 46
- 47
- 48
- 49#重定向stderr,一次一行.
- 50ERRORFILE=script.errors
- 51
- 52bad_command12>$ERRORFILE#毛病动静发到$ERRORFILE中.
- 53bad_command22>>$ERRORFILE#毛病动静增加到$ERRORFILE中.
- 54bad_command3#毛病动静echo到stderr,
- 55#+而且不呈现在$ERRORFILE中.
- 56#每行事后,这些重定向下令也会主动"reset".
- 57#==============================================================================
- 58
- 59
- 60
- 612>&1
- 62#重定向stderr到stdout.
- 63#失掉的毛病动静与stdout一样,发送到一个中央.
- 64
- 65i>&j
- 66#重定向文件形貌符i到j.
- 67#指向i文件的一切输入都发送到j中往.
- 68
- 69>&j
- 70#默许的,重定向文件形貌符1(stdout)到j.
- 71#一切传送到stdout的输入都送到j中往.
- 72
- 730<FILENAME
- 74<FILENAME
- 75#从文件中承受输出.
- 76#与">"是成对下令,而且一般都是分离利用.
- 77#
- 78#grepsearch-word<filename
- 79
- 80
- 81[j]filename
- 82#为了读写"filename",把文件"filename"翻开,而且分派文件形貌符"j"给它.
- 83#假如文件"filename"不存在,那末就创立它.
- 84#假如文件形貌符"j"没指定,那默许是fd0,stdin.
- 85#
- 86#这类使用一般是为了写到一个文件中指定的中央.
- 87echo1234567890>File#写字符串到"File".
- 88exec3File#翻开"File"而且给它分派fd3.
- 89read-n4<&3#只读4个字符.
- 90echo-n.>&3#写一个小数点.
- 91exec3>&-#封闭fd3.
- 92catFile#==>1234.67890
- 93#随机存储.
- 94
- 95
- 96
- 97|
- 98#管道.
- 99#通用目标的处置和下令链工具.
- 100#与">"很类似,可是实践上更通用.
- 101#关于想将下令,剧本,文件和步伐串联起来的时分很有效.
- 102cat*.txt|sort|uniq>result-file
- 103#对一切的.txt文件的输入举行排序,而且删除反复行,
- 104#最初将了局保留到"result-file"中.
能够将输出输入重定向和(或)管道的多个实例分离到一同写在一行上. |
|