您的位置:首页 > 其它

标准输入、输出和错误和文件重定向

2014-08-08 13:56 761 查看

标准输入、输出和错误和文件重定向

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

(2010-08-29 00:54:28)


转载▼

标签:

linux

shell

输入输出重定向

杂谈

分类:工作*Linux(shell)
标准输入、输出和错误
当我们在shell中执行命令的时候,每个进程都和三个打开的文件相联系,并使用文件描述符来引用这些文件。由于文件描述符不容易记忆,shell同时也给出了相应的文件名。

下面就是这些文件描述符及它们通常所对应的文件名:

文件文件描述符

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

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

错误输出文件—标准错误2:这是命令错误的输出,缺省是屏幕,同样也可以是文件。


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

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

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

标准错误是文件描述符2。这是命令错误的输出,缺省是屏幕,同样也可以是文件。你可能会问,为什么会有一个专门针对错误的特殊文件?这是由于很多人喜欢把错误单独保存到一个文件中,特别是在处理大的数据文件时,可能会产生很多错误。

如果没有特别指定文件说明符,命令将使用缺省的文件说明符(你的屏幕,更确切地说是你的终端)。

文件重定向
在执行命令时,可以指定命令的标准输入、输出和错误,要实现这一点就需要使用文件重定向。下表列出了最常用的重定向组合,并给出了相应的文件描述符。

在对标准错误进行重定向时,必须要使用文件描述符,但是对于标准输入和输出来说,这不是必需的。为了完整起见,下表列出了两种方法。

command >filename 把把标准输出重定向到一个新文件中

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

command 1 > fielname 把把标准输出重定向到一个文件中

command > filename2>&1 把把标准输出和标准错误一起重定向到一个文件中

command 2 > filename 把把标准错误重定向到一个文件中

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

command >> filename2>&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 thereI am using a $TERIM terminal
> and my username is $LOGNAME
> bye...
> MAYDAY

$ catmyfile
Hello there Iam 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.out2>&1

在上面的例子中,我们将cleanup脚本的输出重定向到>cleanup.out文件中,而且其错误也被重定向到相同的文件中。

$ grep "standard"* > grep.out2>&1

在上面的例子中,grep命令的标准输出和标准错误都被重定向到grep.out文件中。你在使出前面提到的“此处”文挡时,有可能需要把所有的输出都保存到一个文件中,这样万一出现了错误,就能够被记录下来。通过使用2> & 1就可以做到这一点
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: