Linux||数据流重定向

以下内容首发自公众号“小汪Waud”。

在Linux环境下,我们输入一段命令并运行以后,屏幕里会显示两种结果:运行成功结果即标准输出、运行失败结果即标准错误输出。

标准输出(STDOUT): Standard output,指的是命令执行所返回的正确信息。

标准错误输出(STDERR): Standard error output,指的是命令执行所返回的错误信息。

如果不对STDOUT和STDERR做处理,他们都会显示在屏幕上,通过数据流重定向就可以将其储存到其他的文件中,而将其储存在文件中的特殊字符有:

  • 标准输入stin:代码为0,使用<或<<

  • 标准输出stout:代码为1,使用>或>>

  • 标准错误输出stderr:代码为2,使用2>或2>>

标准输出 > 和 >>

">"表示将标准输出信息重定向到文件中。

">>"表示在文件现有基础上写入数据。

需要注意的是,通过">"去重定向符合以下逻辑:

  1. 如果文件不存在,系统会自动建立文件

  2. 如果文件存在,系统会覆盖里面的内容

通过ll -h可以得到以下列表,标准输出直接显示在屏幕里

ll -h

但如果我们将标准输出重定向到test.txt文件中,屏幕上将不会显示任何东西

ll -h > test.txt

我们在此基础上,打印“What are you doing”并重定向到test.txt文件中

echo "What are you doing" > test.txt

此时的test.txt文件已经被覆盖掉了,而如果这个时候我们想在文件中再写入“I’m fine”呢

echo "I'm fine" >> test.txt

前面提到标准输出代码为1,理论上来说将标准输出重定向应该使用"1>"和"1>>",而我们在使用">"和">>"时,其实是默认代码为1。类似的,如果将标准错误输出重定向需要使用"2>"和"2>>"。

ls wor 2> test.txt

&> 和2>&1

如果一段命令同时输出多个标准输出和标准错误输出该怎么办呢?

例如通过以下命令,我们可以得到多个标准输出和标准错误输出

find /home -name .bashrc

此时使用find /home -name .bashrc > stdout 2> stderr 将会把标准输出信息重定向到stdout中,而标准错误输出信息重定向到stderr中。

image.png

如果想要标准输出信息和标准错误输出信息写入同一个文件该怎么处理呢?

是find /home -name .bashrc > out.txt 2> out.txt 吗?

错,这样的操作会由于两股数据同时交叉写入out.txt而导致数据次序混乱

正确的做法是 find /home -name .bashrc > out.txt 2>&1 或 find /home -name .bashrc &>out.txt

当然,部分情况下我们明知道一些命令会产生标准错误输出,并且我们想直接忽略(不显示),可以直接将标准错误输出重定向到黑洞/dev/null中。

如find /home -name .bashrc 2> /dev/null 将只在屏幕上显示标准输出,而标准错误输出被重定向到黑洞中。

标准输入 < 和 <<

平时我们在创建文件的时候有很多种方法,如使用cat

[CPST2018301210701@localhost ~]$ cat > test.txt
This is the first row
this is the second row
在这里按CTRL D终止输入

如果我们现在有一个名为sample的文件,我们想把sample文件的内容直接输入给test.txt文件,该怎么办呢?

cat > test.txt < sample

得到的结果非常像是通过cp命令复制过来的。

我们再来看一下"<<",在第一个例子中我们最后通过CTRL D来终止了输入,"<<"也是起相同的作用,即输入"<<"右侧的字符可以终止一次输入。

cat > test.txt << "Finished"

看到了吧?我在输入Finished后终止了输入,同时test.txt文件中没有Finished。

参考资料

  1. https://blog.csdn.net/bocai8058/article/details/82932397

  2. 鸟哥的Linux私房菜

你可能感兴趣的:(Linux||数据流重定向)