Linux04 管道和重定向
一、标准的 I/O 流
文件描述符 | 名称 | 描述 | 缺省 |
0 | stdin | 标准输入 | 键盘 |
1 | stdout | 标准输出 | 显示器 |
2 | stderr | 标准错误输出 | 显示器 |
二、重定向
1. 将输出重定向到文件:
n>
将输出从文件描述符 n 重定向到文件。您必须具有该文件的写权限。如果该文件不存在,将创建它。如果该文件已经存在,通常将覆盖所有现有内容,并且没有任何警告。
n>>
将输出从文件描述符 n 重定向到一个文件中。这里也要求您具有该文件的写权限。如果该文件不存在,将创建它。如果该文件已经存在,输出将附加到现有的内容后面。
在 n> 或 n>> 中的 n 引用文件描述符。如果省略它,将执行标准输出。
使用 &> 或 &>> 同时将标准输出和标准错误重定向到同一个文件中。另一种方法是,首先重定向文件描述符 n,然后使用 m>&n 或 m>>&n 将文件描述符 m 重定向到同一个文件。例如,
command 2>&1 >output.txt ## stderr does not go to output.txt
不同于
command >output.txt 2>&1
在第一种情况中,stderr 被重定向到 stdout 的当前位置,然后在将 stdout 重定向到 output.txt,但第二次重定向仅影响 stdout,不影响 stderr。在第二种情况中,stderr 被重定向到 stdout 的当前位置,即 output.txt。
如果您想要完全忽略标准输出或标准错误,可以将流重定向到空文件 /dev/null。
2. 输入重定向
<
3. here-document
它是另一种输入重定向形式。它将 << 和一个单词(比如END)结合构成一个结束标记,用来表示输入端。(缺省用Ctrl-d 表明输入端)
三、管道
在两个命令之间使用管道 | 操作符将的一个命令的 stdout指向第二个命令的 stdin。
许多命令使用连字符 (-) 取代文件名作为一个参数,用于表示输入来自 stdin 而不是文件。
四、使用输出作为参数
如果想将一个命令或文件的内容作为另一个命令的参数而不是输入。管道线不能用于实现该目的。三种常见的解决办法是:
1. xargs 命令
2. 带有 -exec 选项的 find 命令
3. 命令替换
五、分离输出
有时候,您可能希望在屏幕上看到输出,同时保留一个副本。您可以将 tee 和管道一起使用。
对标准输出而言,参数是一个或多个文件。-a 选项附加而非覆盖文件。在前面关于管道的讨论中可以看到,必须先将 stderr 重定向到 stdout ,然后再重定向到 tee,如果您需要同时保存两者的话。
ls h* | tee f1 f2