8455澳门新_8455新葡萄娱乐【官网】

你可以把屏幕输出重定向到一个文件里,stdin(标

  对于任何一个进程,在启动时,都会打开三个流:stdin(标准输入), stdout(标准输出), stderr(标准错误输出)。Stdout,stderr是process与Display之间,stdin是process与keyboard之间。也就是说系统的标准输入输出,是进程与设备间交流的桥梁。

  Linux重定向是指修改原来默认的一些东西,对原来系统命令的默认执行方式进行改变,比如说简单的我不想看到在显示器的输出而是希望输出到某一文件中就可以通过Linux重定向来进行这项工作。

  但是在很多情况下,我们的程序数据并不来自于标准输入,我们在使用标准输出时,也不希望写到显示器上,可能是文件,网络,打印机等。这时候就需要IO Redirect来作用了。还有,为了方便使用等,我们希望将写到Stdout的数据作为另外一个进程的输入,其实这也是IO redirect的一种,不过它有个特殊的名字——pipe。

  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 键盘输入

 

  STDOUT 1 输出信息到提示符窗口

   8455澳门新 1      

  STDERR 2 输出错误信息到提示符窗口

 

  默认的 < 重定向输入操作符是 0,而默认的 > 重定向输出操作符是 1。键入 < 或 > 操作符之后,必须指定数据的读写位置,可以是文件名或其他现有的句柄。

1、IO Redirect

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

1.1 File handle (File Description)

       操作系统内核会为每一个进程分配很多file handler(也叫 File Description),其中初始时会分配3个handle,用数字0,1,2来表示,分别分配给了stdin, stdout, stderr。其他的则是随着需要分配的。

       这样一来,就可以直接使用0,1,2来表示Stdio了。

 

在linux上使用lsof -p pid查看一个进程打开了哪些文件。下面是一个查看运行中的top命令的情况:

 8455澳门新 2

 

 

例如,下面的命令可以将句柄 2(即 STDERR)重定向到句柄 1(即 STDOUT):2>&1

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

  < 将标准输入(stdin, 0)重定向,也就是说数据来源不是键盘,而是其他,例如文件等。

  > 将标准输出(stdout, 1)重定向,也就是说数据不再写到显示器,而是其他地方。

  其中在 >,< 操作符的左边,只能是FD,右边可能是file,也可以是FD等。此外, <等价于 <1, >等价于1>,所以2> 就是将标准错误输出(stderr, 2)重定向。

 

  IO redirect的本质是什么呢?在我看来本质是FD的赋值。怎么理解呢?

  默认情况下一个,一个进程(例如:ls)是这样的:

 

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

 

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

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重定向操作符 功能描述

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必须是存在的。

 

 

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

1.3 变体操作符 >>

 

如果将stdout或者stderr 重定向到一个文件,但文件里已经有内容,会是什么结果呢?使用 > file时,文件中已有的内容会被truncate掉,也就是文件内容被清除了。

如果想要保留文件内容怎么办呢?

有一个变体操作符:>> 以append的方式重定向。

8455澳门新, 

 

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

2、Pipe

       如果希望将输出内容,直接作为另外一个程序的输入,这种技术成为Pipe,能够进行Pipe的进程,必须是父子进程。用“|” 来表示管道。Pipe也是进程间通信的一种技术。

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

 

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

 

  >> 将命令输出添加到文件末尾而不删除文件中已有的信息

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

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

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

  现在我们回过头来看看上面的那条语句mysh > mylog.txt 2>&1就可明白:

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

  2 >& 1 意思是将错误输出重定向到句柄1标准输出;综合起来就是mysh命令执行过程中产生的标准输出和错误输出都会被重定向到mylog.txt中;

  重定向的功能十分强大,有兴趣的可以去尝试各种不同的组合,看看前后位置变下会有什么结果?

  某些时候我们可能并不希望记录什么标准输出或者是错误输出,那可以用mysh >null 2>null或者mysh >/dev/null 2>/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、 管道“|”(pipe line):上一个命令的 stdout 接到下一个命令的 stdin;

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

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

本文由8455澳门新发布于新闻资讯,转载请注明出处:你可以把屏幕输出重定向到一个文件里,stdin(标

相关阅读