Linux标准输入、输出和错误和文件重定向(转)

标准输入、输出和错误

当我们在shell中执行命令的时候,每个进程都和三个打开的文件相联系,并使用文件描述符来引用这些文件。由于文件描述符不容易记忆,shell同时也给出了相应的文件名。
下面就是这些文件描述符及它们通常所对应的文件名:

文件文件描述符
输入文件—标准输入0:它是命令的输入,缺省是键盘,也可以是文件或其他命令的输出。
输出文件—标准输出1:它是命令的输出,缺省是屏幕,也可以是文件。
错误输出文件—标准错误2:这是命令错误的输出,缺省是屏幕,同样也可以是文件。

系统中实际上有1 2个文件描述符,但是正如我们在上表中所看到的, 0、1、2是标准输入、输出和错误。可以任意使用文件描述符3到9。

标准输入是文件描述符0。它是命令的输入,缺省是键盘,也可以是文件或其他命令的输出。

标准输出是文件描述符1。它是命令的输出,缺省是屏幕,也可以是文件。

标准错误是文件描述符2。这是命令错误的输出,缺省是屏幕,同样也可以是文件。你可能会问,为什么会有一个专门针对错误的特殊文件?这是由于很多人喜欢把错误单独保存到一个文件中,特别是在处理大的数据文件时,可能会产生很多错误。
如果没有特别指定文件说明符,命令将使用缺省的文件说明符(你的屏幕,更确切地说是你的终端)。

文件重定向

在执行命令时,可以指定命令的标准输入、输出和错误,要实现这一点就需要使用文件重定向。下表列出了最常用的重定向组合,并给出了相应的文件描述符。
在对标准错误进行重定向时,必须要使用文件描述符,但是对于标准输入和输出来说,这不是必需的。为了完整起见,下表列出了两种方法。

command > filename 把把标准输出重定向到一个新文件中
command >> filename 把把标准输出重定向到一个文件中(追加)
command 1 > fielname 把把标准输出重定向到一个文件中
command > filename 2>&1 把把标准输出和标准错误一起重定向到一个文件中
command 2 > filename 把把标准错误重定向到一个文件中
command 2 >> filename 把把标准输出重定向到一个文件中(追加)
command >> filename 2>&1 把把标准输出和标准错误一起重定向到一个文件中(追加)
command < filename > filename2把command命令以filename文件作为标准输入,以filename2文件作为标准输出
command < filename 把command命令以filename文件作为标准输入
command << delimiter 把从标准输入中读入,直至遇到delimiter分界符
command <&m 把把文件描述符m作为标准输入
command >&m 把把标准输出重定向到文件描述符m中
command <&- 把关闭标准输入

重定向标准输出

让我们来看一个标准输出的例子。在下面的命令中,把/etc/passwd文件中的用户ID域按照用户命排列。该命令的输出重定向到sort.out文件中。要提醒注意的是,在使用sort命令的时候(或其他含有相似输入文件参数的命令),重定向符号一定要离开sort命令两个空格,否则该命令会把它当作输入文件。
$ cat passwd | awk -F: ‘{print $1}‘ | sort  1>sort.out
从表5 - 1中可以看出,我们也可以使用如下的表达方式,结果和上面一样:
$ cat passwd | awk -F: ‘{print $1}‘ | sort  >sort.out
可以把很多命令的输出追加到同一文件中。

如果希望把标准输出重定向到文件中,可以用>filename。在下面的例子中,ls命令的所有输出都被重定向到ls.out文件中:
$ ls >ls.out

如果想创建一个长度为0的空文件,可以用>filename:
$ >myfile

重定向标准输入

可以指定命令的标准输入。在awk一章就会遇到这样的情况。下面给出一个这样的例子:
$ sort < name.txt
在上面的命令中, sort命令的输入是采用重定向的方式给出的,不过也可以直接把相应的
文件作为该命令的参数:
$ sort name.txt
在上面的例子中,还可以更进一步地通过重定向为sort命令指定一个输出文件name.out。
这样屏幕上将不会出现任何信息(除了错误信息以外):
$ sort <name.txt >name.out
在发送邮件时,可以用重定向的方法发送一个文件中的内容。在下面的例子中,用户
louise将收到一个邮件,其中含有文件contents.txt中的内容:
$ mail louise < contents.txt

重定向操作符command << delimiter是一种非常有用的命令,通常都被称为“此处”文挡。
shell将分界符delimiter之后直至下一个同样的分界符之前的所有内容都作为输入,遇到下一个分界符,shell就知道输入结束了。这一命令对于自动或远程的例程非常有用。可以任意定义分界符delimiter,最常见的是EOF,而我最喜欢用MAYDAY,这完全取决于个人的喜好。还可以在<<后面输入变量。
下面给出一个例子,我们创建了一个名为myfile的文件,并在其中使用了TERM和LOGNAME变量。

$cat >> myfile <<MAYDAY

> Hello there I am using a $TERIM terminal

> and my user name is $LOGNAME

> bye...

> MAYDAY

$ cat myfile

Hello there I am using a vt100 terminal

and my user name is dave

bye...

重定向标准错误

为了重定向标准错误,可以指定文件描述符2。
grep命令没有找到该文件,缺省地向终端输出了一个错误信息。现在让我们把错误重定向到文件/dev/null中(实际就上是系统的垃圾箱):
$ grep "trident" missiles 2>/dev/null
这样所有的错误输出都输送到了/dev/null,不再出现在屏幕上。

合并标准输出和标准错误

在合并标准输出和标准错误的时候,切记shell是从左至右分析相应的命令的。下面给出一个例子:
$ cleanup >cleanup.out 2>&1
在上面的例子中,我们将cleanup 脚本的输出重定向到>cleanup.out文件中,而且其错误也被重定向到相同的文件中。
$ grep "standard"* > grep.out 2>&1
在上面的例子中,grep命令的标准输出和标准错误都被重定向到grep.out文件中。你在使出前面提到的“此处”文挡时,有可能需要把所有的输出都保存到一个文件中,这样万一出现了错误,就能够被记录下来。通过使用2 > & 1就可以做到这一点

http://blog.sina.com.cn/s/blog_51dc0fba0100lqgb.html

shell中可能经常能看到:>/dev/null  2>&1

eg:sudo kill -9 `ps -elf |grep -v grep|grep $1|awk ‘{print $4}‘` 1>/dev/null 2>/dev/null

命令的结果可以通过%>的形式来定义输出

/dev/null 代表空设备文件
> 代表重定向到哪里,例如:echo "123" > /home/123.txt
1 表示stdout标准输出,系统默认值是1,所以">/dev/null"等同于"1>/dev/null"
2 表示stderr标准错误
& 表示等同于的意思,2>&1,表示2的输出重定向等同于1

那么本文标题的语句:
1>/dev/null 首先表示标准输出重定向到空设备文件,也就是不输出任何信息到终端,说白了就是不显示任何信息。
2>&1 接着,标准错误输出重定向等同于 标准输出,因为之前标准输出已经重定向到了空设备文件,所以标准错误输出也重定向到空设备文件。

/////////////////////

脚本只使用标准输入、标准输出和标准错误

Shell会自动为我们打开和关闭0、1、2这三个文件描述符,我们不需要显式地打开或关闭它们。标准输入是命令的输入,默认指向键盘;标准输出是命令的输出,默认指向屏幕;标准错误是命令错误信息的输出,默认指向屏幕。

如果没有显式地进行重定向,命令通过文件描述符0从屏幕读取输入,通过文件描述符1和2将输出和错误信息输出到屏幕。但如果我们想从其他文件(再次强调,I/O设备在Unix/Linux中也是文件)读取输入或产生输出,就需要对0、1、2使用重定向了。其语法如下:

command < filename                         把标准输入重定向到filename文件中
command 0< filename                       把标准输入重定向到filename文件中

command > filename                         把标准输出重定向到filename文件中(覆盖)
command 1> fielname                       把标准输出重定向到filename文件中(覆盖)

command >> filename                       把标准输出重定向到filename文件中(追加)
command 1>> filename                     把标准输出重定向到filename文件中(追加)

command 2> filename                       把标准错误重定向到filename文件中(覆盖)
command 2>> filename                     把标准输出重定向到filename文件中(追加)

command > filename 2>&1               把标准输出和标准错误一起重定向到filename文件中(覆盖)
command >> filename 2>&1             把标准输出和标准错误一起重定向到filename文件中(追加)

command < filename >filename2        把标准输入重定向到filename文件中,把标准输出重定向

到filename2文件中
command 0< filename 1> filename2   把标准输入重定向到filename文件中,把标准输出重定向

到filename2文件中

重定向的使用有如下规律:

1)标准输入0、输出1、错误2需要分别重定向,一个重定向只能改变它们中的一个。
2)标准输入0和标准输出1可以省略。(当其出现重定向符号左侧时)
3)文件描述符在重定向符号左侧时直接写即可,在右侧时前面加&。
4)文件描述符与重定向符号之间不能有空格!

http://blog.sina.com.cn/s/blog_4aae007d010192qc.html

时间: 2024-10-12 15:05:23

Linux标准输入、输出和错误和文件重定向(转)的相关文章

Linux shell的标准输入、输出和错误

编译文件时,若编译过程时间长,可以将  标准错误  重定向  输出到一个文件中   2 > 1.txt         也可以通过管道  重定向 到 标准输出    2 > &1 Linux shell的标准输入.输出和错误 标签: linux shellshell重定向 2013-08-19 20:42 30403人阅读 评论(0) 收藏 举报  分类: 系统运维(42)  版权声明:本文为博主原创文章,未经博主允许不得转载. 1.文件描述符 在linux shell执行命令时,每个

[转帖]Linux的标准输入 标准输出和错误输出

https://www.cnblogs.com/softidea/p/3965093.html 感觉自己对 这一块的理解一直不好 昨天同事给了一个 bat 文件也用到了标准输入 直接通过文件进行输入 脚本参数内容 比之前写脚本参数容易的多也规整的多 今天再看 linux的标准输入和标准输出 尤其是哪一句 2>&1 将错误输出 重定向到标准输出 自己竟然一直没有理解到 & 其实是地址符号的意思.. 这一块是在是太low了. 当我们在shell中执行命令的时候,每个进程都和三个打开的文件

C/C++-标准输入/输出重定向为文件输入/输出

/* Time: 2017-02-22 11:11:15 Describe: C++程序将标准输入/输出重定向为文件输入/输出. */ #include <iostream> #include <fstream> #include <string> using namespace std; void f() { string line; while(getline(cin, line)) //input from the file in.txt { cout <&

Shell 标准输入、输出和错误

防伪码:桃花潭水深千尺,不及汪伦送我情. 文件描述符(fd):文件描述符是一个非负整数,在打开现存文件或新建文件时,内核会返回一个 文件描述符,读写文件也需要使用文件描述符来访问文件. 内核为每个进程维护该进程打开的文件记录表.文件描述符只适于 Unix.Linux 操作系统. 8. 1  标准输入.输出和错误 文件描述符  描述  映射关系 0  标准输入,键盘  /dev/stdin -> /proc/self/fd/0 1  标准输出,屏幕  /dev/stdout -> /proc/s

输出,错误,输出追加,错误追加重定向的使用

输出,错误,输出追加,错误追加重定向的使用,不仅可以让我们轻松的实现多个命令的内容用一个文件实现,也让我们对Linux有了更深的了解. 程序:指令+ 数据 读入数据:Input 输出数据:Output 打开的文件都有一个fd: file descriptor ( 文件描述符) Linux 给程序提供三种I/O 设备 标准输入(STDIN )-0 默认接受来自键盘的输入 标准输出(STDOUT )-1 默认输出到终端窗口 标准错误(STDERR )-2 默认输出到终端窗口 1.使用输出重定向创建文

第六章 Shell标准输入、输出和错误

文件描述符(fd):文件描述符是一个非负整数,在打开现存文件或新建文件时,内核会返回一个文件描述符,读写文件也需要使用文件描述符来访问文件. 内核为每个进程维护该进程打开的文件记录表.文件描述符只适应Unix.Linux操作系统. 6.1 标准输入.输出和错误 文件描述符 描述 映射关系 0 标准输入,键盘 /dev/stdin -> /proc/self/fd/0 1 标准输出,屏幕 /dev/stdout -> /proc/self/fd/1 2 标准错误,屏幕 /dev/stderr -

重定向标准输入/输出

Java的标准输入/输出分别通过System.in和System.out来代表,默认情况下它们分别代表键盘和显示器,当程序通过System.in来获取输入时,实际上是从键盘读取输入,当程序试图通过System.out执行输出时,程序总是输出到屏幕 System类里提供三个重定向标准输入/输出的方法: static void setErr(PrintStream err):重定向"标准"错误输出流 static void setIn(InputStream in):重定向"标准

Java 输入/输出——重定向标准输入/输出

在System类中提供了如下三个重定向标准输入/输出方法. static void setErr?(PrintStream err) Reassigns the "standard" error output stream.(重定向"标准"错误输出流) static void setIn?(InputStream in) Reassigns the "standard" input stream.(重定向"标准"输入流) st

Java重定向标准输入/输出

在System类中提供了三个重定向标准输入/输出的方法static void setErr(PrintStream err) 重定向“标准”错误输出流static void setIn(InputStream in)    重定向“标准”输入流static void setOut(PrintStream out)重定向“标准”输出流 参考 http://blog.csdn.net/zhy_cheng/article/details/7891142