欢迎,来自IP地址为:3.94.202.151 的朋友


Linux系统管理有一个十分重要又非常有趣的话题,那就是输入/输出重定向。这一命令行特性可以让输入或者输出重新定向到文件,也可把多条命令通过被称为“命令管道”的管道连接起来。

我们在系统中运行的命令从根本上来说会产生两种输出:

  • 命令结果,即为程序被设计成应该产生的数据
  • 程序状态以及错误消息,这被用来提示用户程序执行的细节

在Linux系统以及其它一些类UNIX系统中,以下是系统默认的三种与输入输出相关的文件标识符:

  • stdin或者0:标准键盘输入,大多数程序从这个文件中读取输入数据
  • stdout或者1:标准输出,指显示器屏幕输出,多数程序把结果输出至此文件
  • stderr或者2:标准错误,程序会把状态以及错误信息输出至这个文件,并在显示器屏幕上进行显示

因此,重定向功能既允许用户更改命令的输入源又可以把输出结果或者错误信息指定到其它目的地。多数情况下,输入/输出重定向会使用<和>重定向操作符。

你可以如下面的示例一样重定向标准输出,在这里,我们要做的是将top命令的结果输出到一个log文件中,以便日后分析使用。

# top -bn 5 > top.log

其中:

-b参数代表top命令采用’batch mode’方式,以便将输出结果重新定向到其它文件

-n参数指定命令终止前重复执行的次数,这里表示重复执行5次

程序执行完成后,就会发现在当前目录生成了一个top.log日志文件,可以通过’cat’命令来查看文件内容。

如果需要对已经存在文件追加内容,可以使用’>>’追加操作符,还是使用上面的例子,如果使用以下方式:

# top -bn 5 >> top.log

就表示在top.log文件中将输出结果追加写入,而并不将文件原有内容覆盖。

需要注意的是,可以使用标准输入输出描述符来定义重定向,上面的例子可以写成:

# top -bn 5 1> top.log

其中1表示top命令的标准输出结果,注意1和重定向符’>’中间是没有空格的。

Linux系统如何将标准错误重定向到文件

为了将命令的标准错误进行重定向,你需要显式的使用标准错误描述符2,以便shell了解你需要做的事情。

举一个简单的例子,使用ls命令,而没有给定正确的参数:

# ls -z

由于ls命令是没有-z参数的,执行这条命令后会产生标准错误,于是我们就可以把这个错误重定向到文件中:

# ls -z 2> ls-error.log
# cat ls-error.log
ls: invalid option -- 'z'
Try `ls --help' for more information.

错误结果并没有在屏幕显示,而是输出到一个log文件中。

如何将标准输出和标准错误重定向到同一文件

当然可以将命令的所有输出(标准输出和标准错误)同时捕获到同一文件中。要达到此目的,有两种方法可供选择,均采用标准输出和标准错误的数字描述符来实现。

  • 第一种方法:这是一种比较古老的使用方式,示例如下
# ls -z > ls-error.log 2>&1

这条命令表示shell首先会将ls命令的标准结果输出到ls-error.log文件中,而’2>&1’表示将标准错误结果同样输出到标准输出重定向的文件中。

  • 第二种方法:这种写法比较简单,但是不太容易理解
# ls -z &> ls-error.log

其中’&’表示标准输出和标准错误。

当然,以上所有的示例都可以使用’>>’追加符来追加内容。

如何重定向标准输入至文件

由于并不是所有的程序都需要从标准键盘中取得输入内容,所以需要使用<符来对标准输入进行重新指定。

# cat < ls-error.log
ls: invalid option -- 'z'
Try `ls --help' for more information.

如何重新输入/输出

能够理解下面命令的意思,那么就对输入/输出重定向有了比较清楚的认识了。其实只要注意重定向操作符的方向和文件描述符的意义,那么理解想来也不困难。

# sort <ls-error.log >sort.output
# cat sort.output
Try `ls --help' for more information.
ls: invalid option -- 'z'

如何使用I/O重定向运用命令管道

把一条命令的输出作为另一条命令的输入,可以使用命令管道。这是一个构建命令行复杂操作的强大工具。例如下面的示例命令,可以显示最近修改的3个文件:

#  ls -lt | head -n 4
total 52
-rw-r--r-- 1 root root 64 Oct 3 10:38 sort.output
-rw-r--r-- 1 root root 64 Oct 3 10:09 ls-error.log
-rw-r--r-- 1 root root 12178 Oct 3 09:53 top.log

其中参数说明如下:

-l 表示使用详细列表方式

-t 表示根据文件修改时间进行排序,最近修改的排在最前面

-n 表示显示结果从开头算显示的行数(由于tatal占了一行,所有命令参数为4)

构建命令管道的两个重要命令

下面将着重介绍两个构建命令管道的重要命令。

xargs是用来从标准输入构建可执行命令行的命令,使用示例如下:

# echo /dataroot/ /dataroot/backup/ | xargs -n 1 cp -v /dataroot/mailbox/Mailbox 
`/dataroot/mailbox/Mailbox' -> `/dataroot/Mailbox'
`/dataroot/mailbox/Mailbox' -> `/dataroot/backup/Mailbox'

参数说明:

-n 用于通知xargs命令每次使用作为后面命令参数的项数

cp 是文件拷贝命令,用于指定xargs命令执行的操作

-v 是cp命令的参数,用于显示命令执行结果

以上命令完成的工作就是将Mailbox文件分别拷贝至/dataroot目录和/dataroot/backup目录。

tee命令是从标准输入读取并将输出同时输出至标准输出和文件中,示例如下:

# # echo "Testing how tee command works" | tee file1 
Testing how tee command works
# ls -a
. .. Mailbox backup file1 ftproot lost+found ls-error.log mailbox sort.output top.log wwwroot
# cat file1
Testing how tee command works

可以看到,使用tee命令后,echo命令的结果不仅会在屏幕显示,同时会将结果输出到file文件中,文件内容就是echo命令的结果。

以上就是Linux神奇的输入输出重定向的基本知识,对于习惯使用图形用户界面的人来说,可能会想像不到,通过命令行工具,仅需一行就可以完成复杂的工作。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注