Linux中重定向应注意的事情

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux中重定向应注意的事情相关的知识,希望对你有一定的参考价值。

你是否见过`bash ... 2>&1 1>file.txt`的写法? 还没发现这样的写法有什么问题? 那么恭喜你, 看完本文你又将学会一个新知识!

引言

你是否见过bash ... 2>&1 1>file.txt的写法? 还没发现这样的写法有什么问题? 那么恭喜你, 看完本文你又将学会一个新知识!

重定向的错误用法

以引言中命令为例, 2>&1表示将错误输出重定向到标准输出, 1>file.txt表示将标准输出重定向到file.txt文件, 看起来的意思就是将标准输出和错误输出全都重定向到file.txt?

错啦! 上述命令只会标准输出重定向到file.txt文件, 而错误输出还是重定向到终端(或者叫做命令行, 控制台, 屏幕). 因为首先解析的是2>&1,此时的1指向的还是标准输出, 即终端, 解析到1>file.txt时, 标准输出才被重定向到file.txt. 下面我将用一个例子来验证我的结论:

test.sh是一个简单的脚本, 会把STDOUT输出到标准输出, 将STDERR输出到错误输出

$ cat test.sh
echo \'STDOUT\' >&1
echo \'STDERR\' >&2

我们先验证脚本的正确性, 标准输出和错误输出都被正确的捕捉到了, 脚本可以同时输出标准输出和错误输出, 正确性得以验证.

现在我们再来验证我一开始的结论, 执行bash ... 2>&1 1>file.txt形式的命令, 可以看到错误输出STDERR被输出到了终端, 而file.txt中仅有标准输出STDOUT

那么应该怎么改成我们想要的结果呢? 很简单, 将2>&1和1>file.txt调换个位置即可, 即bash ... 1>file.txt 2>&1; 或者使用bash ... &>file.txt, 都可以达到我们想要的效果

重定向另外一个值得注意的事项

重定向另外一个需要注意的事项就是: 执行类似于command > file.txt的命令时, 会首先判断file.txt是否存在, 若存在则先清空文件, 若不存在则创建文件, 随后才会执行command

假设有一个已经排好序的文件file.txt, 我们对这个文件去重的话, 执行uniq file.txt > file.txt会直接清空文件

想要不生成额外的临时文件做到去重的话, 正确的做法应该是使用管道|配合tee命令, 而不是使用重定向

Linux中重定向命令

1、标准输入的控制

语法:命令<文件    (将文件作为命令的输入)

mail -s "mail test" [email protected] < file1

将文件file1当做信件的内容,主题名称为mail test,送给收信人。

2、标准输出的控制

语法:命令>文件   (将命令的执行结果送至指定的文件中)

例如: ls -l > list

将执行"ls -l"命令的结果写入文件list中。(覆盖list中原有内容)

语法:命令>>文件  (将命令的结果附加到文件list中)

例如:cat /opt/profile >> list

将执行"cat /opt/profile"命令的结果附加到文件list中。

以上是关于Linux中重定向应注意的事情的主要内容,如果未能解决你的问题,请参考以下文章

在 JSP 中重定向页面?

Linux中重定向

Linux中重定向

在 Android 中重定向音频/创建备用声音路径

如何在 php 中重定向/调度? [复制]

Linux中重定向管道和grep命令总结