输出重定向 >
、 >>
cat 命令是一个比较常用的命令,下面结合cat提供几个示例,说明重定向符的几种使用方式。
- cat的简单使用。
cat 命令单独使用可作为输入,默认将输出至标准输出,也就是屏幕。在使用cat输入时,Ctrl-D可以输入eof结束输入。
# 注:以下用 <注释> 表示注释
root]#cat # 默认输出到屏幕
123456
123456 <ctrl-D>
root]#cat >&1 # 与直接使用cat功能相同
123456
123456 <Ctrl-D>
cat 命令加上文件,就可以输出文件的内容。
>
输出重定向
输出重定向符后加上一个文件,可将数据存储到文件中。
root]#cat > file
123
456
789 <Ctrl-D>
root]#cat file
123
456
789 <Ctrl-D>
3. >>
追加重定向。
可将数据追加至之前的数据后面,不会进行覆盖。而>
是以覆盖的方式写入的。
root]#cat file
123546789
root]#cat >> file
abcdefghi <Ctrl-D>
root]#cat file
123546789
abcdefghi
4. 错误重定向
>
其实是 1>
的简写,也就是将标准输出重定向,而还有一种常用的是标准错误输出重定向。
标准错误输出(文件句柄 /proc/self/fd/2)一般情况下输出到屏幕上,我们也可以利用输出重定向将错误信息输出到一个文件中便于查看。
可以看到,我们试图cat 一个不存在的文件时,系统提示一个错误,它是直接打印在屏幕上的。 我们使用 2>
可以将标准错误输出重定向到 error.txt 中。
现在,我们增加一个 test 文件,再执行之前的命令,使得命令执行成功不产生错误输出。可以看到,test文件的内容正确被输出,因此证明错误重定向并不会影响我们正常的输出功能。
现在我们还可以,将标准输出重定向到 out.txt 文件中,将错误输出重定向到 error.txt 中。可以看到 out.txt 文件成功被写入。
同时,我们可以将标准输出,和错误输出都重定向到同一个文件中。不过这次我们使用 >>
追加的方式。(注:这里可以使用 cat test 1>> log.txt 2>> log.txt || date >> log.txt )
命令,在执行 cat test 失败时,再多执行一个语句 date ,这样在执行错误时能够将错误时间也一并写入文件中)
6. 重定向绑定
2>&1
这就是一个最形象的重定向绑定,此语句将错误输出将和标准输出绑定到同一个文件描述符上,即它们现在都输出到屏幕上。
同理,如果我们想将输出和错误输出都绑定到同一个文件上,可以不用 1>> log.txt 2>> log.txt 这样的写法,直接 cat ttt 1>>log.txt 2>&1
即可。注意这里 标准输出使用的是追加方式,因此绑定后的错误输出也是追加方式写入的。
- 重定向到 /dev/null
一般地,我们想将输出结果丢弃,我们会输出到 /dev/null 。而我们直到可以同时进行多次重定向。
这里不演示,需要注意的是, >/dev/null 2>&1
与 2>&1 >/dev/null
这两种用法。
- 前者:将标准输出 重定向至 null, 而后将错误输出与 标准输出绑定,则。
标准输出 与 错误输出 都输出到 null, 即丢弃数据。 - 后者:将错误输出 重定向至 标准输出(屏幕),而后将 标准输出 重定向至 null。
需要注意的是,一开始标准输入指代的是屏幕,而标准输出在重定向时从指向屏幕变成了指向null。这有点像指针的概念。而后者的效果就是,错误输出 在屏幕显示,标准输出 丢弃。
输入重定向 <
、<<
及命令行管道 |
<
输入
命令 < 文件 将指定文件作为命令的输入设备
<<
分界符
命令 << 分界符 表示从标准输入设备(键盘)中读入,直到遇到分界符才停止(读入的数据不包括分界符),这里的分界符其实就是自定义的字符串
这里指定 end 作为输入结束的分界符。
<
与>
组合使用
命令 < 文件 1 > 文件 2 将文件 1 作为命令的输入设备,该命令的执行结果输出到文件 2 中。
这里将一个无序的文件 file 内容排序后,重定向到新的文件 file_ordered 中。
4. |
管道也可作为一种标准输入
一般我们将上一个命令的输出结果传递给下一个命令时(将左侧命令的标准输出转换为标准输入,提供给右侧命令作为参数),可以使用 |
来连接。
例如:
5. |
与 xargs
组合
xargs 命令 是给其他命令传递参数的一个过滤器,也是组合多个命令的一个工具。它擅长将标准输入数据转换成命令行参数,xargs 能够处理管道或者 stdin 并将其转换成特定命令的命令参数
这里,我们只讨论其 处理管道 的功能。 因为有些命令不接受标准输入作为参数,只能直接在命令行输入参数,这导致无法用管道命令传递参数。
例如:echo 命令
在比如:递归的删除当前目录下所有以 .cpp 后缀结尾的文件 (参考:https://blog.csdn.net/weixin_43919932/article/details/120268713)
find ./ -name "*.cpp" | xargs rm -f