对于其余1个进程,在运营时,都会打开多少个流:stdin(标准输入),
stdout(标准输出),
stderr(标准错误输出)。Stdout,stderr是process与Display之间,stdin是process与keyboard之间。相当于说系统的专业输入输出,是进程与设施间沟通的大桥。

  Linux重定向是指修改原来暗许的部分事物,对原来系统命令的暗许执行办法举行改动,比如说简单的我不想看看在显示屏的出口而是愿意输出到某一文件中就能够通过Linux重定平昔实行那项工作。

inux重定向是指修改原来默许的有的事物,对原先系统命令的暗中认可执行措施开始展览更改,比如说简单的自个儿不想见到在屏幕的出口而是希望输出到某一文书中就能够透过Linux重定一贯进行这项工作。

详见介绍Linux重定向的利用

  但是在举不胜举场合下,大家的程序数据并不出自黄浩然规输入,我们在应用正式输出时,也不指望写到显示屏上,恐怕是文本,互联网,打字与印刷机等。那时候就必要IO
Redirect来效用了。还有,为了方便使用等,大家盼望将写到Stdout的多寡作为此外3个经过的输入,其实那也是IO
redirect的一种,但是它有个特殊的名字——pipe。

  Linux暗中认可输入是键盘,输出是荧屏。你能够用重定一直改变这一个设置。比如用wc命令的时候自然是要手动输入一篇文字来估测计算字符数的,用了重定向后方可向来把二个已经写好的文本用‘<’指向那条命令,就径直能够总括那几个文件的字符数等了。输出也是一模一样,你能够把显示器输出重定向到二个文件里,再到文件里去看结果。重定向操作符能够用来将指令输入和出口数据流从暗中认可地方重定向到其他职位,其输入或输出数据流的地点称为句柄;常见的句柄有二种,当然句柄能够自行扩展,一般的OS都提供类似的功力。句柄
句柄代号 句柄描述

  Linux默许输入是键盘,输出是显示屏。你能够用重定一直改变这么些设置。比如用wc命令的时候自然是要手动输入一篇文字来测算字符数的,用了重定向后方可间接把一个已经写好的文本用‘<’指向那条命令,就平素能够总计那些文件的字符数等了。输出也是千篇一律,你可以把显示器输出重定向到贰个文书里,再到文件里去看结果。重定向操作符能够用来将指令输入和出口数据流从暗中认可地点重定向到别的职位,其输入或输出数据流的地点称为句柄;常见的句柄有二种,当然句柄能够自行扩张,一般的OS都提供类似的机能。句柄
句柄代号 句柄描述

 

  • 1、IORedirect
    • 1.1 File Handle(File
      Description)
    • 1.2 基本的重定向操作符 >
      <

      • 1.2.1
        右侧是文件
      • 1.2.2
        右边是FD
    • 1.3
      操作符变体 >>
  • 2、Pipe

  STDIN 0 键盘输入

  STDIN 0 键盘输入

Linux重定向是指修改原来默许的有的事物,对原本系统命令的暗许执行方式展开更改,比如说容易的本身不想见到在显示器的输出而是期待输出到某一文书中就足以经过Linux重定一直进行那项工作。

 

  STDOUT 1 输出音讯到晋升符窗口

  STDOUT 1 输出消息到提拔符窗口

 

   澳门金沙国际 1 
    

  STDEKuga奔驰M级 2 输出错误新闻到晋升符窗口

  STDECRUISEROdyssey 2 输出错误消息到升迁符窗口

  Linux暗许输入是键盘,输出是显示屏。你可以用重定一直改变那些设置。比如用wc命令的时候自然是要手动输入一篇文字来测算字符数的,用了重定向后可以平素把三个早就写好的文件用‘<’指向那条命令,就一向能够总计那一个文件的字符数等了。输出也是平等,你能够把显示屏输出重定向到一个文本里,再到文件里去看结果。重定向操作符能够用来将下令输入和输出数据流从暗中同意地方重定向到任何职责,其输入或输出数据流的职位称为句柄;常见的句柄有二种,当然句柄能够活动扩充,一般的OS都提供类似的功用。句柄
句柄代号 句柄描述

 

  私下认可的 < 重定向输入操作符是 0,而暗中同意的 > 重定向输出操作符是
1。键入 < 或 >
操作符之后,必须内定数量的读写地方,能够是文件名或任何现有的句柄。

  暗中同意的 < 重定向输入操作符是 0,而暗中认可的 > 重定向输出操作符是
1。键入 < 或 >
操作符之后,必须钦命数量的读写地点,能够是文件名或其余现有的句柄。

  www.2cto.com  

1、IO Redirect

  要钦赐重定向到存活句柄,请使用与 & 字符,前边接要重定向的句柄号(即
&句柄号)。

  要钦命重定向到现有句柄,请使用与 & 字符,后边接要重定向的句柄号(即
&句柄号)。

  STDIN 0 键盘输入

1.1 File handle (File Description)

       操作系统内核会为每一个历程分配很多file handler(也叫 File
Description),当中始发时会分配二个handle,用数字0,1,2来代表,分别分配给了stdin,
stdout, stderr。别的的则是随着供给分配的。

       那样一来,就足以从来使用0,1,2来表示Stdio了。

 

在linux上利用lsof -p
pid查看一个历程打开了什么文件。上边是3个查看运营中的top命令的气象:

 澳门金沙国际 2

 

 

譬如,上边包车型地铁下令能够将句柄 2(即 STDE索罗德PAJERO)重定向到句柄 1(即
STDOUT):2>&1

比如,下边包车型大巴吩咐能够将句柄 2(即 STDETiguanRAV4)重定向到句柄 1(即
STDOUT):2>&1

 

1.2 基本的重定向操作符:>与<

  < 将正式输入(stdin,
0)重定向,也等于说数据来源于不是键盘,而是其它,例如文件等。

  > 将规范输出(stdout,
1)重定向,也正是说数据不再写到显示器,而是另内地点。

  其中在 >,<
操作符的右侧,只可以是FD,左侧只怕是file,也可以是FD等。其它, <等价于
<1, >等价于1>,所以2> 正是将行业内部错误输出(stderr, 2)重定向。

 

  IO redirect的龙虎山真面目是怎么样啊?在笔者眼里本质是FD的赋值。怎么通晓吧?

  暗中认可意况下3个,七个进度(例如:ls)是那样的:

 

对于一个进程而言:
#0 = keyboard
#1 = display
#2 = display

 

  下表列出了可用以重定向输入和出口数据流的操作符:

  下表列出了可用于重定向输入和出口数据流的操作符:

  STDOUT 1 输出音讯到提拔符窗口

1.2.1 操作符右侧是文件

ls >a:代表了 fd1=a
#0 = keyboard
#1 = a
#2 = display

Ls 3>a :代表了fd3=a

sort<file.txt :代表了fd0=file.txt

 

  Linux重定向操作符 作用描述

  Linux重定向操作符 功能描述

 

1.2.2 操作符右侧是FD

若是指望在多少个FD之间开展赋值运算,那么就用>&可能<&。

那么明亮上依旧 >时赋值运算符,&则是dup2系统调用了。

2>&1的意趣正是 对
FD1执行dup2,得到FD1的正片,然后赋值给FD2,也正是说FD1指向了哪个人,FD2也去指向何人。

 

例如:

3>file.txt 2>&3 代表了:FD3–>file.txt,那么FD2—>file.txt

亟需留意的是:>本身不要求文件必须是存在的,不过透过了上述复制并赋值操作和后,运行进度之初就要准备好相应的流,此时就急需文件file.txt必须是存在的。

 

 

  > 将指令输出写入文件或配备,而不是命令提醒符或句柄

  > 将指令输出写入文件或设施,而不是命令提醒符或句柄

  STDE福睿斯CR-V 2 输出错误音讯到升迁符窗口

1.3 变体操作符 >>

 

假定将stdout也许stderr
重定向到3个文件,但文件里早就有内容,会是什么样结果吗?使用 >
file时,文件中已部分内容会被truncate掉,也等于文件内容被解除了。

一经想要保留文件内容肿么办吧?

有三个变体操作符:>> 以append的法子重定向。

 

 

  < 从文件而不是从键盘或句柄读入命令输入

  < 从文件而不是从键盘或句柄读入命令输入

 

2、Pipe

      
假使指望将出口内容,直接作为别的八个主次的输入,那种技术变成Pipe,能够进行Pipe的进度,必须是父子进程。用“|”
来表示管道。Pipe也是进度间通讯的一种技术。

比如说:lsof -p pid | grep xxx ,父进度是 lsof, 子进程是grep。

 

本篇内容适用于 Windows,Linux,Unix等操作系统。

 

详见介绍Linux重定向的选取,Linux下输入输出重定向。  >> 将指令输出添加到文件末尾而不删除文件中已部分新闻

  >> 将指令输出添加到文件末尾而不删除文件中已某个信息

  暗中同意的 < 重定向输入操作符是 0,而默许的 > 重定向输出操作符是
1。键入 < 或 >
操作符之后,必须钦定数量的读写地点,能够是文件名或别的现有的句柄。

  >& 将二个句柄的输出写入到另多少个句柄的输入中

  >& 将一个句柄的输出写入到另1个句柄的输入中

 

  <& 从1个句柄读取输入并将其写入到另3个句柄输出中

  <& 从一个句柄读取输入并将其写入到另2个句柄输出中

  要钦赐重定向到存活句柄,请使用与 & 字符,后边接要重定向的句柄号(即
&句柄号)。

  | 从二个发令中读取输出并将其写入另3个限令的输入中;也称之为管道操作符

  | 从二个限令中读取输出并将其写入另多个下令的输入中;也叫做管道操作符

 

  今后大家回过头来看看下面的那条语句mysh > mylog.txt
2>&1就可见晓:

  将来大家回过头来看看上边的这条语句mysh > mylog.txt
2>&1就可掌握:

  例如,下边包车型的士指令能够将句柄 2(即 STDERAV4科雷傲)重定向到句柄 1(即
STDOUT):2>&1

  > mylog.txt意思是将规范输出重定向到mylog.txt,等价于mysh 1>
mylog.txt;

  > mylog.txt意思是将正式输出重定向到mylog.txt,等价于mysh 1>
mylog.txt;

 

  2 >& 1
情趣是将错误输出重定向到句柄1正式输出;综合起来正是mysh命令执行进程中发出的科鲁班出和错误输出都会被重定向到mylog.txt中;

  2 >& 1
意思是将错误输出重定向到句柄1正式输出;综合起来正是mysh命令执行进度中产生的正统输出和不当输出都会被重定向到mylog.txt中;

  下表列出了可用来重定向输入和输出数据流的操作符:

  重定向的功能至极精锐,有趣味的能够去尝试各个不一样的结合,看看前后地点变下会有哪些结果?

  重定向的成效特别强劲,有趣味的能够去尝尝各个差别的整合,看看前后地方变下会有啥样结果?

  www.2cto.com  

  某个时候大家恐怕并不期待记录什么正儿八经输出或许是谬误输出,那能够用mysh
>null 2>null也许mysh >/dev/null 2>/dev/null;

  有个别时候大家兴许并不愿意记录什么标准输出或许是错误输出,那能够用mysh
>null 2>null只怕mysh >/dev/null 2>/dev/null;

  Linux重定向操作符 成效描述

  I/O重定向详解

  I/O重定向详解

 

  壹 、 基本概念(那是掌握前边的学识的前提,请务必领悟)

  一 、 基本概念(那是领略前边的学识的前提,请务必理解)

  > 将指令输出写入文件或设施,而不是命令提示符或句柄

  a、 I/O重定向常常与 FD有关,shell的FD平日为1叁个,即 0~9;

  a、 I/O重定向日常与 FD有关,shell的FD日常为1二个,即 0~9;

 

  b、
常用FD有三个,为0(stdin,标准输入)、1(stdout,标准输出)、2(stderr,标准错误输出),暗中同意与keyboard、monitor、monitor有关;

  b、
常用FD有一个,为0(stdin,标准输入)、1(stdout,标准输出)、2(stderr,标准错误输出),暗中认可与keyboard、monitor、monitor有关;

  < 从文件而不是从键盘或句柄读入命令输入

  c、 用 < 来改变读进的数码信道(stdin),使之从钦命的档案读进;

  c、 用 < 来改变读进的数据信道(stdin),使之从钦点的档案读进;

 

  d、 用 > 来改变送出的数额信道(stdout,
stderr),使之输出到钦命的档案;

  d、 用 > 来改变送出的数目信道(stdout,
stderr),使之输出到钦点的档案;

  >> 将指令输出添加到文件末尾而不删除文件中已某些消息

  e、 0 是 < 的私下认可值,由此 < 与 0<是一致的;同理,> 与
1> 是同等的;

  e、 0 是 < 的暗许值,由此 < 与 0<是如出一辙的;同理,> 与
1> 是均等的;

 

  f、 在IO重定向 中,stdout 与 stderr 的管道会先准备好,才会从 stdin
读进资料;

  f、 在IO重定向 中,stdout 与 stderr 的管道会先准备好,才会从 stdin
读进资料;

  >& 将二个句柄的出口写入到另八个句柄的输入中

  g、 管道“|”(pipe line):上3个指令的 stdout 接到下三个指令的 stdin;

  g、 管道“|”(pipe line):上八个命令的 stdout 接到下2个命令的 stdin;

 

澳门金沙国际 ,  h、 tee 命令是在不影响原本 I/O 的意况下,将 stdout 复制一份到档案去;

  h、 tee 命令是在不影响原本 I/O 的动静下,将 stdout 复制一份到档案去;

  <& 从四个句柄读取输入并将其写入到另二个句柄输出中

  i、
bash(ksh)执行命令的经过:分析命令-变量求值-命令替代(“和$(
))-重定向-通配符展开-分明路径-执行命令;

  i、
bash(ksh)执行命令的长河:分析命令-变量求值-命令替代(“和$(
))-重定向-通配符展开-分明路径-执行命令;

 

  j、 ( ) 将 command group 置于 sub-shell 去实施,也称 nested
sub-shell,它有某个11分关键的表征是:继承父shell的Standard input,
output, and error plus any other open file descriptors。

  j、 ( ) 将 command group 置于 sub-shell 去执行,也称 nested
sub-shell,它有少数老大关键的性状是:继承父shell的Standard input,
output, and error plus any other open file descriptors。

  | 从叁个下令中读取输出并将其写入另1个命令的输入中;也称为管道操作符

  k、 exec 命令:常用来替代当前 shell 同等对待复启航三个shell,换句话说,并从未运维子
shell。使用这一限令时别的现有条件都将会被清除。exec
在对文件讲述符举办操作的时候,也只有在此时,exec 不会覆盖你日前的 shell
环境。

  k、 exec 命令:常用来代表当前 shell 并再一次起动一个shell,换句话说,并不曾运转子
shell。使用这一限令时别的现有条件都将会被破除。exec
在对文本讲述符实行操作的时候,也只有在此刻,exec 不会覆盖你近来的 shell
环境。

 

  2、 基本IO

  2、 基本IO

  未来大家回过头来看看上边的那条语句mysh > mylog.txt
2>&1就可通晓:

  cmd > file 把 stdout 重定向到 file 文件中;

  cmd > file 把 stdout 重定向到 file 文件中;

 

  cmd >> file 把 stdout 重定向到 file 文件中(追加);

  cmd >> file 把 stdout 重定向到 file 文件中(追加);

  > mylog.txt意思是将行业内部输出重定向到mylog.txt,等价于mysh 1>
mylog.txt;

  cmd 1> fiel 把 stdout 重定向到 file 文件中;

  cmd 1> fiel 把 stdout 重定向到 file 文件中;

 

  cmd > file 2>&1 把 stdout 和 stderr 一起重定向到 file 文件中;

  cmd > file 2>&1 把 stdout 和 stderr 一起重定向到 file 文件中;

  2 >& 1
情趣是将错误输出重定向到句柄1行业内部输出;综合起来就是mysh命令执行进度中生出的正经输出和谬误输出都会被重定向到mylog.txt中;

  cmd 2> file 把 stderr 重定向到 file 文件中;

  cmd 2> file 把 stderr 重定向到 file 文件中;

  www.2cto.com  

  cmd 2>> file 把 stderr 重定向到 file 文件中(追加);

  cmd 2>> file 把 stderr 重定向到 file 文件中(追加);

  重定向的功用十三分精锐,有趣味的能够去品尝各个分化的咬合,看看前后地点变下会有如何结果?

  cmd >> file 2>&1 把 stderr 和 stderr 一起重定向到 file
文件中(追加);

  cmd >> file 2>&1 把 stderr 和 stderr 一起重定向到 file
文件中(追加);

 

  cmd < file >file2 cmd 命令以 file 文件作为 stdin,以 file2
文件作为 stdout;

  cmd < file >file2 cmd 命令以 file 文件作为 stdin,以 file2
文件作为 stdout;

  有些时候大家大概并不期待记录什么正儿八经输出或许是谬误输出,那能够用mysh
>null 2>null也许mysh >/dev/null 2>/dev/null;

  cat <>file 以读写的主意打开 file;

  cat <>file 以读写的章程打开 file;

 

  cmd < file cmd 命令以 file 文件作为 stdin;

  cmd < file cmd 命令以 file 文件作为 stdin;

  I/O重定向详解

  cmd << delimiter Here document,从 stdin 中读入,直至遇到delimiter 分界符。

  cmd << delimiter Here document,从 stdin 中读入,直至遭遇delimiter 分界符。

 

  3、 进阶IO

  3、 进阶IO

  1、 基本概念(那是明亮前面包车型客车知识的前提,请务必精通)

  >&n 使用系统调用 dup (2) 复制文件讲述符 n 并把结果用作专业输出;

  >&n 使用系统调用 dup (2) 复制文件讲述符 n 并把结果用作标准输出;

 

  <&n 标准输入复制自文件讲述符 n;

  <&n 标准输入复制自文件讲述符 n;

  a、 I/O重定向日常与 FD有关,shell的FD日常为十二个,即 0~9;

  <&- 关闭标准输入(键盘);

  <&- 关闭标准输入(键盘);

 

  >&- 关闭标准输出;

  >&- 关闭标准输出;

  b、
常用FD有一个,为0(stdin,标准输入)、1(stdout,标准输出)、2(stderr,标准错误输出),暗许与keyboard、monitor、monitor有关;

  n<&- 表示将 n 号输加入关贸总协定组织闭;

  n<&- 表示将 n 号输加入关贸总协定组织闭;

  www.2cto.com  

  n>&- 表示将 n 号输出关闭;

  n>&- 表示将 n 号输出关闭;

  c、 用 < 来改变读进的数码信道(stdin),使之从钦点的档案读进;

  上述全体格局都能够指导2个数字,此时树立的文本讲述符由这一个数字钦命而不是缺省的
0 或 1。如:

  上述全数情势都得以教导一个数字,此时成立的文书讲述符由这么些数字钦定而不是缺省的
0 或 1。如:

 

  … 2>file 运营2个限令并把错误输出(文件讲述符 2)定向到 file。

  … 2>file 运营叁个限令并把错误输出(文件讲述符 2)定向到 file。

  d、 用 > 来改变送出的数码信道(stdout,
stderr),使之输出到内定的档案;

  … 2>&1
运转三个下令并把它的专业输出和出口合并。(严刻的便是通过复制文件讲述符 1
来树立文件讲述符 2 ,但功用平时是联合了八个流。)

  … 2>&1
运维二个限令并把它的规范输出和输出合并。(严峻的正是通过复制文件讲述符 1
来树立文件讲述符 2 ,但职能一般是联合了七个流。)

 

  大家对 2>&1详细说美赞臣下 :2>&1 也正是 FD2=FD1
,那里并不是说FD2 的值 等于FD1的值,因为 >
是改变送出的多寡信道,也正是说把 FD2 的 “数据输出通道” 改为 FD1 的
“数据输出通道”。尽管仅仅那样,那么些改变好像一贯不什么作用,因为 FD2
的暗许输出和 FD1的默许输出本来都以 monitor,一样的!但是,当 FD1
是其它文件,甚至是其他 FD
时,这些就有着特种的用途了。请我们必须通晓这点。

  大家对 2>&1详细说美赞臣(Meadjohnson)下 :2>&1 也便是 FD2=FD1
,那里并不是说FD2 的值 等于FD1的值,因为 >
是改变送出的数据信道,也正是说把 FD2 的 “数据输出通道” 改为 FD1 的
“数据输出通道”。假若仅仅那样,那个改变好像一直不什么效益,因为 FD2
的暗中认可输出和 FD1的暗许输出本来都以 monitor,一样的!不过,当 FD1
是其它文件,甚至是其它 FD
时,那些就持有非凡的用处了。请大家必须领会那或多或少。

  e、 0 是 < 的暗中认可值,因而 < 与 0<是一律的;同理,> 与
1> 是一致的;

  exec 0exec 1>outfilename # 打开文件outfilename作为stdout。

  exec 0exec 1>outfilename # 打开文件outfilename作为stdout。

 

  exec 2>errfilename # 打开文件 errfilename作为 stderr。

  exec 2>errfilename # 打开文件 errfilename作为 stderr。

  f、 在IO重定向 中,stdout 与 stderr 的管道会先准备好,才会从 stdin
读进资料;

  exec 0<&- # 关闭 FD0。

  exec 0<&- # 关闭 FD0。

 

  exec 1>&- # 关闭 FD1。

  exec 1>&- # 关闭 FD1。

  g、 管道“|”(pipe line):上3个下令的 stdout 接到下贰个命令的 stdin;

  exec 5>&- # 关闭 FD5。

  exec 5>&- # 关闭 FD5。

 

  1    COMMAND_OUTPUT >
  2      # 重定向stdout到1个文件.
  3      # 假若没有那一个文件就创办, 不然就覆盖.
  4
  5      ls -lR > dir-tree.list
  6      # 创制3个富含目录树列表的文件.
  7
  8    : > filename
  9      # > 会把公文”filename”截断为0长度.
  10      # 假如文件不存在,
那么就创办叁个0长度的文书(与’touch’的功用一样).
  11      # : 是叁个占位符, 不发生任何输出.
  12
  13    > filename   
  14      # > 会把公文”filename”截断为0长度.
  15      # 即使文件不存在,
那么就创立3个0长度的公文(与’touch’的机能等同).
  16      # (与上方的”: >”效果同样,
可是在少数shell下或许无法工作.)
  17
  18    COMMAND_OUTPUT >>
  19      # 重定向stdout到2个文件.
  20      # 如若文件不设有, 那么就创制它, 假诺存在,
那么就充实到文件前面.
  21
  22
  23      # 单行重定向命令(只会潜移默化它们所在的行):

1    COMMAND_OUTPUT >
   2       # 重定向stdout到一个文件.
   3       # 如果没有这个文件就创建, 否则就覆盖.
   4 
   5       ls -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 
  18    COMMAND_OUTPUT >>
  19       # 重定向stdout到一个文件.
  20       # 如果文件不存在, 那么就创建它, 如果存在, 那么就追加到文件后边.
  21 
  22 
  23       # 单行重定向命令(只会影响它们所在的行):
  24       # --------------------------------------------------------------------
  25 
  26    1>filename
  27       # 重定向stdout到文件"filename".
  28    1>>filename
  29       # 重定向并追加stdout到文件"filename".
  30    2>filename
  31       # 重定向stderr到文件"filename".
  32    2>>filename
  33       # 重定向并追加stderr到文件"filename".
  34    &>filename
  35       # 将stdout和stderr都重定向到文件"filename".
  36 
  37       #==============================================================================
  38       # 重定向stdout, 一次一行.
  39       LOGFILE=script.log
  40 
  41       echo "This statement is sent to the log file, \"$LOGFILE\"." 1>$LOGFILE
  42       echo "This statement is appended to \"$LOGFILE\"." 1>>$LOGFILE
  43       echo "This statement is also appended to \"$LOGFILE\"." 1>>$LOGFILE
  44       echo "This statement is echoed to stdout, and will not appear in \"$LOGFILE\"."
  45       # 每行过后, 这些重定向命令会自动"reset".
  46 
  47 
  48 
  49       # 重定向stderr, 一次一行.
  50       ERRORFILE=script.errors
  51 
  52       bad_command1 2>$ERRORFILE       #  错误消息发到$ERRORFILE中.
  53       bad_command2 2>>$ERRORFILE      #  错误消息添加到$ERRORFILE中.
  54       bad_command3                    #  错误消息echo到stderr,
  55                                       #+ 并且不出现在$ERRORFILE中.
  56       # 每行过后, 这些重定向命令也会自动"reset".
  57       #==============================================================================
  58 
  59 
  60 
  61    2>&1
  62       # 重定向stderr到stdout.
  63       # 得到的错误消息与stdout一样, 发送到一个地方.
  64 
  65    i>&j
  66       # 重定向文件描述符i 到 j.
  67       # 指向i文件的所有输出都发送到j中去.
  68 
  69    >&j
  70       # 默认的, 重定向文件描述符1(stdout)到 j.
  71       # 所有传递到stdout的输出都送到j中去.
  72 
  73    0< FILENAME
  74     < FILENAME
  75       # 从文件中接受输入.
  76       # 与">"是成对命令, 并且通常都是结合使用.
  77       #
  78       # grep search-word <filename
  79 
  80 
  81    [j]<>filename
  82       # 为了读写"filename", 把文件"filename"打开, 并且分配文件描述符"j"给它.
  83       # 如果文件"filename"不存在, 那么就创建它.
  84       # 如果文件描述符"j"没指定, 那默认是fd 0, stdin.
  85       #
  86       # 这种应用通常是为了写到一个文件中指定的地方.
  87       echo 1234567890 > File    # 写字符串到"File".
  88       exec 3<> File             # 打开"File"并且给它分配fd 3.
  89       read -n 4 <&3             # 只读4个字符.
  90       echo -n . >&3             # 写一个小数点.
  91       exec 3>&-                 # 关闭fd 3.
  92       cat File                  # ==> 1234.67890
  93       # 随机存储.
  94 
  95 
  96 
  97    |
  98       # 管道.
  99       # 通用目的的处理和命令链工具.
 100       # 与">"很相似, 但是实际上更通用.
 101       # 对于想将命令, 脚本, 文件和程序串连起来的时候很有用.
 102       cat *.txt | sort | uniq > result-file
 103       # 对所有的.txt文件的输出进行排序, 并且删除重复行,
 104       # 最后将结果保存到"result-file"中.

  h、 tee 命令是在不影响原本 I/O 的情况下,将 stdout 复制一份到档案去;

  24      #

  25
  26    1>filename
  27      # 重定向stdout到文件”filename”.
  28    1>>filename
  29      # 重定向并扩充stdout到文件”filename”.
  30    2>filename
  31      # 重定向stderr到文件”filename”.
  32    2>>filename
  33      # 重定向并追加stderr到文件”filename”.
  34    &>filename
  35      # 将stdout和stderr都重定向到文件”filename”.
  36
  37     
#==============================================================================
  38      # 重定向stdout, 1遍一行.
  39      LOGFILE=script.log
  40
  41      echo “This statement is sent to the log file, \”$LOGFILE\”.”
1>$LOGFILE
  42      echo “This statement is appended to \”$LOGFILE\”.”
1>>$LOGFILE
  43      echo “This statement is also appended to \”$LOGFILE\”.”
1>>$LOGFILE
  44      echo “This statement is echoed to stdout, and will not appear
in \”$LOGFILE\”.”
  45      # 每行过后, 那一个重定向命令会活动”reset”.
  46
  47
  48
  49      # 重定向stderr, 1回一行.
  50      ERRORFILE=script.errors
  51
  52      bad_command1 2>$ERRORFILE      # 
错误新闻发到$E奥迪Q5RO帕杰罗FILE中.
  53      bad_command2 2>>$ERRORFILE      # 
错误讯息添加到$ESportageRO凯雷德FILE中.
  54      bad_command3                    #  错误信息echo到stderr,
  55                                      #+
并且不出新在$EPRADOROCR-VFILE中.
  56      # 每行过后, 那一个重定向命令也会自行”reset”.
  57     
#==============================================================================
  58
  59
  60
  61    2>&1
  62      # 重定向stderr到stdout.
  63      # 获得的错误消息与stdout一样, 发送到二个地点.
  64
  65    i>&j
  66      # 重定向文件讲述符i 到 j.
  67      # 指向i文件的享有出口都发送到j中去.
  68
  69    >&j
  70      # 默许的, 重定向文件讲述符1(stdout)到 j.
  71      # 全部传递到stdout的输出都送到j中去.
  72
  73    0< FILENAME
  74    < FILENAME
  75      # 从文件中接受输入.
  76      # 与”>”是成对命令, 并且通常都以整合使用.
  77      #
  78      # grep search-word <filename
  79
  80
  81    [j]<>filename
  82      # 为了读写”filename”, 把文件”filename”打开,
并且分配文件讲述符”j”给它.
  83      # 假使文件”filename”不存在, 那么就创办它.
  84      # 如若文件讲述符”j”没内定, 那暗中认可是fd 0, stdin.
  85      #
  86      # 那种应用普通是为了写到叁个文本中钦定的地点.
  87      echo 1234567890 > File    # 写字符串到”File”.
  88      exec 3<> File            # 打开”File”并且给它分配fd

  1.   89      read -n 4 <&3            # 只读4个字符.
      90      echo -n . >&3            # 写3个小数点.
      91      exec 3>&-                # 关闭fd 3.
      92      cat File                  # ==> 1234.67890
      93      # 随机存款和储蓄.
      94
      95
      96
      97    |
      98      # 管道.
      99      # 通用目标的处理和指令链工具.
     100      # 与”>”很相似, 可是实际上更通用.
     101      # 对于想将指令, 脚本, 文件和次序串连起来的时候很有用.
     102      cat *.txt | sort | uniq > result-file
     103      # 对拥有的.txt文件的出口进行排序, 并且删除重复行,
     104      # 最终将结果保存到”result-file”中.

 

澳门金沙国际 3

可以将输入输出重定向和(或)管道的四个实例结合到一道写在一行上.

 

1 command < input-file > output-file
   2 
   3 command1 | command2 | command3 > output-file

  i、
bash(ksh)执行命令的历程:分析命令-变量求值-命令替代(“和$(
))-重定向-通配符展开-鲜明路径-执行命令;

能够将多个出口流重定向到二个文本上.

 

1 ls -yz >> command.log 2>&1
   2 #  将错误选项"yz"的结果放到文件"command.log"中.
   3 #  因为stderr被重定向到这个文件中,
   4 #+ 所有的错误消息也就都指向那里了.
   5 
   6 #  注意, 下边这个例子就不会给出相同的结果.
   7 ls -yz 2>&1 >> command.log
   8 #  输出一个错误消息, 但是并不写到文件中.
   9 
  10 #  如果将stdout和stderr都重定向,
  11 #+ 命令的顺序会有些不同.

  j、 ( ) 将 command group 置于 sub-shell 去实施,也称 nested
sub-shell,它有几许十三分关键的性子是:继承父shell的Standard input,
output, and error plus any other open file descriptors。

exec <filename 命令会将stdin重定向到文件中. 从那句初始,
前边的输入就都来自于这些文件了, 而不是明媒正娶输入了(平常都是键盘输入).
那样就提供了一种按行读取文件的情势, 并且能够应用sed 和/或
awk来对每一行实行分析.

 

使用exec重定向标准输入**

  k、 exec 命令:常用来取代当前 shell 并重新开动三个shell,换句话说,并不曾运转子
shell。使用这一命令时其余现有条件都将会被拔除。exec
在对文本讲述符进行操作的时候,也唯有在此刻,exec 不会覆盖你日前的 shell
环境。

1 #!/bin/bash
   2 # 使用'exec'重定向标准输入.
   3 
   4 
   5 exec 6<&0          # 将文件描述符#6与stdin链接起来.
   6                    # 保存了stdin.
   7 
   8 exec < data-file   # stdin被文件"data-file"所代替.
   9 
  10 read a1            # 读取文件"data-file"的第一行.
  11 read a2            # 读取文件"data-file"的第二行.
  12 
  13 echo
  14 echo "Following lines read from file."
  15 echo "-------------------------------"
  16 echo $a1
  17 echo $a2
  18 
  19 echo; echo; echo
  20 
  21 exec 0<&6 6<&-
  22 #  现在将stdin从fd #6中恢复, 因为刚才我们把stdin重定向到#6了,
  23 #+ 然后关闭fd #6 ( 6<&- ), 好让这个描述符继续被其他进程所使用.
  24 #
  25 # <&6 6<&-    这么做也可以.
  26 
  27 echo -n "Enter data  "
  28 read b1  # 现在"read"已经恢复正常了, 就是从stdin中读取.
  29 echo "Input read from stdin."
  30 echo "----------------------"
  31 echo "b1 = $b1"
  32 
  33 echo
  34 
  35 exit 0

  www.2cto.com  

使用exec来重定向stdout

  2、 基本IO

1 #!/bin/bash
   2 # reassign-stdout.sh
   3 
   4 LOGFILE=logfile.txt
   5 
   6 exec 6>&1           # 将fd #6与stdout相连接.
   7                     # 保存stdout.
   8 
   9 exec > $LOGFILE     # stdout就被文件"logfile.txt"所代替了.
  10 
  11 # ----------------------------------------------------------- #
  12 # 在这块中所有命令的输出就都发向文件 $LOGFILE.
  13 
  14 echo -n "Logfile: "
  15 date
  16 echo "-------------------------------------"
  17 echo
  18 
  19 echo "Output of \"ls -al\" command"
  20 echo
  21 ls -al
  22 echo; echo
  23 echo "Output of \"df\" command"
  24 echo
  25 df
  26 
  27 # ----------------------------------------------------------- #
  28 
  29 exec 1>&6 6>&-      # 恢复stdout, 然后关闭文件描述符#6.
  30 
  31 echo
  32 echo "== stdout now restored to default == "
  33 echo
  34 ls -al
  35 echo
  36 
  37 exit 0

 


  cmd > file 把 stdout 重定向到 file 文件中;


 

使用exec在同一脚本中重定向stdin和stdout

  cmd >> file 把 stdout 重定向到 file 文件中(追加);

1 #!/bin/bash
   2 # upperconv.sh
   3 # 将一个指定的输入文件转换为大写.
   4 
   5 E_FILE_ACCESS=70
   6 E_WRONG_ARGS=71
   7 
   8 if [ ! -r "$1" ]     # 判断指定的输入文件是否可读?
   9 then
  10   echo "Can't read from input file!"
  11   echo "Usage: $0 input-file output-file"
  12   exit $E_FILE_ACCESS
  13 fi                   #  即使输入文件($1)没被指定
  14                      #+ 也还是会以相同的错误退出(为什么?).
  15 
  16 if [ -z "$2" ]
  17 then
  18   echo "Need to specify output file."
  19   echo "Usage: $0 input-file output-file"
  20   exit $E_WRONG_ARGS
  21 fi
  22 
  23 
  24 exec 4<&0
  25 exec < $1            # 将会从输入文件中读取.
  26 
  27 exec 7>&1
  28 exec > $2            # 将写到输出文件中.
  29                      # 假设输出文件是可写的(添加检查?).
  30 
  31 # -----------------------------------------------
  32     cat - | tr a-z A-Z   # 转换为大写.
  33 #   ^^^^^                # 从stdin中读取.Reads from stdin.
  34 #           ^^^^^^^^^^   # 写到stdout上.
  35 # 然而, stdin和stdout都被重定向了.
  36 # -----------------------------------------------
  37 
  38 exec 1>&7 7>&-       # 恢复 stout.
  39 exec 0<&4 4<&-       # 恢复 stdin.
  40 
  41 # 恢复之后, 下边这行代码将会如期望的一样打印到stdout上.
  42 echo "File \"$1\" written to \"$2\" as uppercase conversion."
  43 
  44 exit 0

 


  cmd 1> fiel 把 stdout 重定向到 file 文件中;

I/O重定向是一种幸免可怕的子shell中不可存取变量难题的方法.

 


  cmd > file 2>&1 把 stdout 和 stderr 一起重定向到 file 文件中;

避免子shell

 

1 #!/bin/bash
   2 # avoid-subshell.sh
   3 # Matthew Walker提出的建议.
   4 
   5 Lines=0
   6 
   7 echo
   8 
   9 cat myfile.txt | while read line;  #  (译者注: 管道会产生子shell)
  10                  do {
  11                    echo $line
  12                    (( Lines++ ));  #  增加这个变量的值
  13                                    #+ 但是外部循环却不能存取.
  14                                    #  子shell问题.
  15                  }
  16                  done
  17 
  18 echo "Number of lines read = $Lines"     # 0
  19                                          # 错误!
  20 
  21 echo "------------------------"
  22 
  23 
  24 exec 3<> myfile.txt
  25 while read line <&3
  26 do {
  27   echo "$line"
  28   (( Lines++ ));                   #  增加这个变量的值
  29                                    #+ 现在外部循环就可以存取了.
  30                                    #  没有子shell, 现在就没问题了.
  31 }
  32 done
  33 exec 3>&-
  34 
  35 echo "Number of lines read = $Lines"     # 8
  36 
  37 echo
  38 
  39 exit 0
  40 
  41 # 下边这些行是脚本的结果, 脚本是不会走到这里的.
  42 
  43 $ cat myfile.txt
  44 
  45 Line 1.
  46 Line 2.
  47 Line 3.
  48 Line 4.
  49 Line 5.
  50 Line 6.
  51 Line 7.
  52 Line 8.

  cmd 2> file 把 stderr 重定向到 file 文件中;

 

  cmd 2>> file 把 stderr 重定向到 file 文件中(追加);

 

  cmd >> file 2>&1 把 stderr 和 stderr 一起重定向到 file
文件中(追加);

 

  cmd < file >file2 cmd 命令以 file 文件作为 stdin,以 file2
文件作为 stdout;

 

  cat <>file 以读写的不二法门打开 file;

 

  cmd < file cmd 命令以 file 文件作为 stdin;

 

  cmd << delimiter Here document,从 stdin 中读入,直至碰着delimiter 分界符。

 

  3、 进阶IO  www.2cto.com  

 

  >&n 使用系统调用 dup (2) 复制文件讲述符 n 并把结果用作专业输出;

 

  <&n 标准输入复制自文件讲述符 n;

 

  <&- 关闭标准输入(键盘);

 

  >&- 关闭标准输出;

 

  n<&- 表示将 n 号输加入关贸总协定组织闭;

 

  n>&- 表示将 n 号输出关闭;

 

  上述全数格局都足以教导二个数字,此时树立的文本讲述符由那几个数字钦命而不是缺省的
0 或 1。如:

 

  … 2>file 运营3个命令并把错误输出(文件讲述符 2)定向到 file。

 

  … 2>&1
运维叁个指令并把它的规范输出和输出合并。(严刻的乃是通过复制文件讲述符 1
来树立文件讲述符 2 ,但效率一般是联合了七个流。)

  www.2cto.com  

  大家对 2>&1详细说美素佳儿(Friso)下 :2>&1 也便是 FD2=FD1
,那里并不是说FD2 的值 等于FD1的值,因为 >
是改变送出的数量信道,也便是说把 FD2 的 “数据输出通道” 改为 FD1 的
“数据输出通道”。若是唯有那样,那几个改变好像没有怎么作用,因为 FD2
的默许输出和 FD1的私下认可输出本来都是 monitor,一样的!可是,当 FD1
是任何文件,甚至是任何 FD
时,那么些就持有卓越的用处了。请咱们必须通晓那或多或少。

 

  exec 0exec 1>outfilename # 打开文件outfilename作为stdout。

 

  exec 2>errfilename # 打开文件 errfilename作为 stderr。

  exec 0<&- # 关闭 FD0。

  exec 1>&- # 关闭 FD1。

  exec 5>&- # 关闭 FD5。

 

  那样就做到了Linux重定向的读书。

 

Linux重定向是指修改原来暗许的局地事物,对本来系统命令的暗中同意执行格局展开改动,比如说简单的自作者不想看看…

相关文章