Linux——管道与重定向
参考资料:
重定向标准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——管道与重定向的更多相关文章
- Linux入门-7 Linux管道、重定向以及文本处理
Linux管道.重定向以及文本处理 1 Linux多命令协作:管道及重定向 管道和重定向 2 Linux命令行文本处理工具 文件浏览 基于关键字搜索-grep 基于列处理文本-cut 文本统计-wc ...
- Linux管道及重定向
Linux管道及重定向 对shell有一定了解的人都知道,管道和重定向是 Linux 中非常实用的 IPC 机制.在shell中,我们通常使用符合'|'来表示管道,符号'>'和'<'表示重 ...
- linux管道和重定向
管道 管道应该是等左边的程序执行完,才使用左边的程序的输出执行右边的程序. 但是在测试的时候,如果左边的程序无限循环且不等待的输出,那么左边的程序执行时右边的程序也会执行,个人感觉这是linux的机制 ...
- linux 管道与重定向
命令行shell数据流有如下定义: 通过管道和重定向可以控制CLI的数据流
- Linux基本配置和管理 2 ---- Linux多命令协作----管道及重定向
1 管道和重定向 1 在Linux中大多数命令都很简单,很少出现复杂的命令,每个命令只是实现一个简单的功能,我们可以通过组合不同的命令来实现复杂的功能 2 在Linux中几乎所有的命令返回的数据都是纯 ...
- Linux入门基础 #9:管道及重定向
本文出自 http://blog.csdn.net/shuangde800 ------------------------------------------------------------ ...
- linux文件管理之管道与重定向
============================================================== 内容提要: 输入输出重定向.管道: 重定向的作用: 文件描述符 0 1 2 ...
- Linux入门基础(五):Linux管道,重定向,文本处理
多命令协作:管道及重定向 在Linux中,大多数命令都很简单,每个命令往往只实现一个或几个很简单功能. 我们可以通过将不同功能的命令组合起来一起使用,达到完成某个复杂功能的目的 CLI下几乎所有的命令 ...
- linux 学习管道 和重定向
开源文化的理念之一 就是不要重新发明轮子 在linux 系统中大多是都是非常简单的命令,每个命令都是实现一个或者几个简单的功能,我们可以将不同的命令组合在一起 来达到复杂的功能的目的,在linux中因 ...
随机推荐
- MFC框架各部分指针获取方式
MFC框架各部分指针获取方式 前人在CSDN总结的,曾经帮助过我,整理总结一下,希望也能帮助一下别人. 获得CWinApp 获得CMainFrame 获得CChildFrame 获得CDocument ...
- 一、ffmpeg理论
一.ffmpeg三件套 ffprobe看文件属性 ffmpeg 编转码 ffplay 播放器 C:\Users\Bruce\Desktop\Temp\ffmpeg\ffmpeg\ToolPack\ff ...
- 记一次在mac上源码编译curl,使其支持NSS的过程
一.背景 在一次学习https原理的过程中,希望客户端指定特定的cipher suites来抓包分析SSL/TLS的握手过程,就想到了使用curl工具,而不是使用浏览器. 接下来使用man curl找 ...
- 【转】DDR3和eMMC区别
转自:https://www.cnblogs.com/debruyne/p/9186619.html DDR3内存条和eMMC存储器区别: 1. 存储性质不同:2. 存储容量不同:3. 运行速度不同: ...
- [BJWC2010]严格次小生成树(LCA,最小生成树)
[BJWC2010]严格次小生成树 题目描述 小C最近学了很多最小生成树的算法,Prim算法.Kurskal算法.消圈算法等等.正当小C洋洋得意之时,小P又来泼小C冷水了.小P说,让小C求出一个无向图 ...
- AOP拦截日志类,抛异常:java.lang.IllegalStateException: It is illegal to call this method if the current request is not in asynchronous mode
AOP的日志拦截类中,抛出异常: java.lang.IllegalStateException: It is illegal to call this method if the current r ...
- bzoj4399 魔法少女LJJ 线段树合并+线段树二分+并查集
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4399 题解 毒瘤题 \(9\) 种操作还有支持动态图的连通性 仔细读题 $ c<=7$. ...
- TOJ 4105 Lines Counting (树状数组)
题意:给定N条线段,每条线段的两个端点L和R都是整数.然后给出M个询问,每次询问给定两个区间[L1,R1]和[L2,R2],问有多少条线段满足:L1≤L≤R1 , L2≤R≤R2 ? 题解,采用离线做 ...
- 算法-python
选择排序:一个列表被分为无序列表和有序列表,选择排序就是拿无序列表的第一个和后面的每一个相比较,每一趟选择出最小的一个,添加进有序列表. def select_sort(list): for i in ...
- MySQL修改密码方法汇总
本文给大家汇总介绍了MySQL修改密码的方法,分为MySQL5.7版本之前以及MySQL5.7版本之后的修改方法,有需要的小伙伴可以参考下 MySQL5.7版本之前修改密码的方法: 方法1: 用SET ...