参考资料:

极客学院
IBMdeveloperWorks

重定向标准I/O

Linux shell(比如Bash)接收或发送序列和字符串流形式的输入或输出。每个字符都独立于与之相邻的字符。字符没有被组织成结构化记录或固定大小的块。不管实际的字符串流进入或来自文件、键盘、显示窗口或其他 I/O 设备,都使用文件 I/O 技术来访问流。Linux shell 使用 3 种标准的 I/O 流,每种流都与一个文件描述符相关联:

  • stdout 标准输出流,它显示来自命令的输出,默认输出显示到终端。它的文件描述符为 1。
  • stderr  是标准错误流,它显示来自命令的错误输出,默认输出显示到终端。它的文件描述符为 2。
  • stdin    标准输入流,它为命令提供输入。它的文件描述符为 0。

输出重定向

将输出重定向到文件有两种方法:

n>        将输出从文件描述符 n 重定向到文件。必须具有该文件的写权限。如果该文件不存在,将创建它。如果该文件已经存在,通常将覆盖所有现有内容,并且没有任何警告。

n>>     将输出从文件描述符 n 重定向到一个文件中。这里也一样要求具有该文件的写权限。如果该文件不存在,将创建它。如果该文件已经存在,输出将附加到现有的内容后面。

直观的表述如下:

  • 1>       表示标准输出重定向,覆盖

  • 1>>     表示标准输出重定向,追加

  • 2>      表示标准错误输出重定向,覆盖

  • 2>>   表示标准错误输出重定向,追加

其中默认缺省表示标准输出。使用 n>的输出重定向通常覆盖现有的文件。可以使用 set 内置控件的 noclobber 选项对此进行控制。如果该选项已经设置,您可以使用 n>| 覆盖它

另外,当我们使用 ">" 重定向符来重定向输出结果时,目标文件总是从开头被重写。 所以例如我们 ls 命令没有产生运行结果,只有错误信息,但重定向操作开始重写文件,然后由于错误而停止,导致文件内容删除。因此,利用这个特点,如果我们需要删除一个文件内容,或者创建一个新的空文件的时候,我们完全可以使用如下技巧

zyzhang@zyzhang-Ubuntu:~$ > output.txt

 在某些情况下,我们可能想要将标准输出和标准错误都重定向到一个文件中。这通常为自动进程或后台作业而执行的,以便以后可以查看输出。使用 &> 或 &>> 同时将标准输出和标准错误重定向到同一个文件中。

zyzhang@zyzhang-Ubuntu:~$ ls -l /bin/usr &> output.txt

另一种方法是,首先重定向文件描述符 n,然后使用 m>&n 或 m>>&n 将文件描述符 m 重定向到同一个文件。例如,

command >output.txt 2>&1

首先重定向标准输出到文件output.txt文件中,然后重定向文件描述符2(标准错误)到文件描述符1(标准输出)使用表示法 2>&1。

注意:重定向的顺序安排非常重要。标准错误的重定向必须总是出现在标准输出重定向之后,要不然它不起作用。上面的例子,

>output.txt 2>&1

重定向标准错误到文件 output.txt,但是如果命令顺序改为:

2>&1 >ls-output.txt

则标准错误定向到屏幕。

有时候,我们想忽略标准输出或标准错误,为此,将选择的流重定向到空文件 /dev/null,这个文件是系统设备,叫做位存储桶,它可以 接受输入,并且对输入不做任何处理。

zyzhang@zyzhang-Ubuntu:~$ ls -l /bin/usr 2> /dev/null

输入重定向

cat - 连接文件

cat 命令读取一个或多个文件,然后复制它们到标准输出,就像这样:

cat [file]

在大多数情况下,我们可以认为 cat 命令相似于 DOS 中的 TYPE 命令。你可以使用 cat 来显示文件而没有分页,例如:

zyzhang@zyzhang-Ubuntu:~$ cat ls-output.txt

将会显示文件 ls-output.txt 的内容。cat 经常被用来显示简短的文本文件。因为 cat 可以 接受不只一个文件作为参数,所以它也可以用来把文件连接在一起。

我们试着做些其他的工作。 如果我们输入不带参数的"cat"命令,会发生什么呢:

zyzhang@zyzhang-Ubuntu:~$ cat

没有发生任何事情,它只是坐在那里,好像挂掉了一样。看起来是那样,但是它正在做它该做的事情:
如果 cat 没有给出任何参数,它会从标准输入读入数据,因为标准输入,默认情况下,连接到键盘。 它正在等待我们输入数据!试试这个:

zyzhang@zyzhang-Ubuntu:~$ cat
The quick brown fox jumped over the lazy dog.

下一步,输入 Ctrl-d(按住 Ctrl 键同时按下"d"),来告诉 cat,在标准输入中, 它已经到达文件末尾(EOF):

zyzhang@zyzhang-Ubuntu:~$ cat
The quick brown fox jumped over the lazy dog.

由于文件名参数的缺席,cat 复制标准输入到标准输出,所以我们看到文本行重复出现。 我们可以使用这种行为来创建简短的文本文件。比方说,我们想创建一个叫做"lazy_dog.txt" 的文件,这个文件包含例子中的文本。我们这样做:

zyzhang@zyzhang-Ubuntu:~$ cat > lazy_dog.txt
The quick brown fox jumped over the lazy dog.

输入命令,其后输入要放入文件中的文本。记住,最后输入 Ctrl-d。通过使用这个命令,我们 实现了世界上最低能的文字处理器!看一下运行结果,我们使用 cat 来复制文件内容到 标准输出:

zyzhang@zyzhang-Ubuntu:~$ cat lazy_dog.txt
The quick brown fox jumped over the lazy dog.

现在我们知道怎讲接受标准输入,除了文件名参数,让我们试着重定向标准输入:

zyzhang@zyzhang-Ubuntu:~$ cat < lazy_dog.txt
The quick brown fox jumped over the lazy dog.

使用“<”重定向操作符,我们把标准输入源从键盘改到文件 lazy_dog.tx。我们看到结果 和传递单个文件名作为参数的执行结果一样。把这和传递一个文件名参数作比较,尤其没有意义, 但它是用来说明把一个文件作为标准输入源。

Linux——管道与重定向的更多相关文章

  1. Linux入门-7 Linux管道、重定向以及文本处理

    Linux管道.重定向以及文本处理 1 Linux多命令协作:管道及重定向 管道和重定向 2 Linux命令行文本处理工具 文件浏览 基于关键字搜索-grep 基于列处理文本-cut 文本统计-wc ...

  2. Linux管道及重定向

    Linux管道及重定向 对shell有一定了解的人都知道,管道和重定向是 Linux 中非常实用的 IPC 机制.在shell中,我们通常使用符合'|'来表示管道,符号'>'和'<'表示重 ...

  3. linux管道和重定向

    管道 管道应该是等左边的程序执行完,才使用左边的程序的输出执行右边的程序. 但是在测试的时候,如果左边的程序无限循环且不等待的输出,那么左边的程序执行时右边的程序也会执行,个人感觉这是linux的机制 ...

  4. linux 管道与重定向

    命令行shell数据流有如下定义: 通过管道和重定向可以控制CLI的数据流

  5. Linux基本配置和管理 2 ---- Linux多命令协作----管道及重定向

    1 管道和重定向 1 在Linux中大多数命令都很简单,很少出现复杂的命令,每个命令只是实现一个简单的功能,我们可以通过组合不同的命令来实现复杂的功能 2 在Linux中几乎所有的命令返回的数据都是纯 ...

  6. Linux入门基础 #9:管道及重定向

    本文出自   http://blog.csdn.net/shuangde800 ------------------------------------------------------------ ...

  7. linux文件管理之管道与重定向

    ============================================================== 内容提要: 输入输出重定向.管道: 重定向的作用: 文件描述符 0 1 2 ...

  8. Linux入门基础(五):Linux管道,重定向,文本处理

    多命令协作:管道及重定向 在Linux中,大多数命令都很简单,每个命令往往只实现一个或几个很简单功能. 我们可以通过将不同功能的命令组合起来一起使用,达到完成某个复杂功能的目的 CLI下几乎所有的命令 ...

  9. linux 学习管道 和重定向

    开源文化的理念之一 就是不要重新发明轮子 在linux 系统中大多是都是非常简单的命令,每个命令都是实现一个或者几个简单的功能,我们可以将不同的命令组合在一起 来达到复杂的功能的目的,在linux中因 ...

随机推荐

  1. js页面加载的几种方式的速度: window.onload、 $(window).load、 $(function(){})、 $(document).ready(function () {})、onload=‘asd()’

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  2. 初学css display

    display:网上查到的资料说是:属性规定元素应该生成的框的类型.例如:网页上的导航栏,使用ul->li那么需要让其排列在一行上可以使用设置li:{float:left:},也可以使用disp ...

  3. (四:NIO系列) Java NIO Selector

    出处:Java NIO Selector 1.1. Selector入门 1.1.1. Selector的和Channel的关系 Java NIO的核心组件包括: (1)Channel(通道) (2) ...

  4. 高性能和可扩展的React-Redux

    注意:文章很长,只想了解逻辑而不深入的,可以直接跳到总结部分. 初识 首先,从它暴露对外的API开始 ReactReduxContext /* 提供了 React.createContext(null ...

  5. django 中间件的使用??

    django 中的中间件(middleware),在django中,中间件其实就是一个类,在请求到来和结束后,django会根据自己的规则在合适的时机执行中间件中相应的方法. 在django项目的se ...

  6. WPF的DataTrigger使用

    首先创建一个空的项目 然后看看前台写的代码,如下图所示 <Grid> <StackPanel HorizontalAlignment="Center" Verti ...

  7. CSS3 flexbox弹性布局实例

    常用例子 1.居中对齐 <!DOCTYPE html> <head> <meta charset="utf-8"> <style type ...

  8. bzoj5015 [Snoi2017]礼物 矩阵快速幂+二项式展开

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=5015 题解 设 \(f_i\) 表示第 \(i\) 个朋友的礼物,\(s_i\) 表示从 \( ...

  9. python 按多维列表中的某一个元素位进行排序

    import os,re top = os.popen("tasklist") process_list = [] split_r = r"\s+" memor ...

  10. flume(2)

    接续上一篇:https://www.cnblogs.com/metianzing/p/9511852.html 这里也是主要记录配置文件. 以上一篇案例五为基础,考虑到日志服务器和采集日志的服务器往往 ...