Linux笔记之shell中的重定向
code review!
文章目录
- Linux笔记之shell中的重定向
-
- 1.shell重定向介绍
- 2.文件描述符
- 3.输出重定向
- 4.输入重定向
- 5.重定向绑定
-
- >/dev/null
- 2>&1
- [>/dev/null 2>&1 和 2>&1 >/dev/null](#>/dev/null 2>&1 和 2>&1 >/dev/null)
- [>/dev/null 2>&1 和 >/dev/null 2>/dev/null](#>/dev/null 2>&1 和 >/dev/null 2>/dev/null)
- 6.最常见的2>/dev/null详解
- 7.编译一个代码时,如何只打印标准错误输出
1.shell重定向介绍
就像我们平时写的程序一样,一段程序会处理外部的输入,然后将运算结果输出到指定的位置。在交互式的程序中,输入来自用户的键盘和鼠标,结果输出到用户的屏幕,甚至播放设备中。而对于某些后台运行的程序,输入可能来自于外部的一些文件,运算的结果通常又写到其他的文件中。而且程序在运行的过程中,会有一些关键性的信息,比如异常堆栈,外部接口调用情况等,这些都会统统写到日志文件里。
shell脚本也一样,但是我们一般在使用shell命令的时候,更多地还是通过键盘输入,然后在屏幕上查看命令的执行结果。如果某些情况下,我们需要将shell命令的执行结果存储到文件中,那么我们就需要使用输入输出的重定向功能。
2.文件描述符
3.输出重定向
我们使用>或者>>对输出进行重定向。符号的左边表示文件描述符,如果没有的话表示1,也就是标准输出,符号的右边可以是一个文件,也可以是一个输出设备。当使用>时,会判断右边的文件存不存在,如果存在的话就先删除,然后创建一个新的文件,不存在的话则直接创建。但是当使用>>进行追加时,则不会删除原来已经存在的文件。
我们看一下以下的例子:
我们创建一个测试目录,目录下面仅有一个a.txt文件。在我们执行ls a.txt b.txt之后,一共有两种输出,其中ls: 无法访问b.txt: 没有那个文件或目录是错误输出,a.txt是标准输出。
在上述命令中,我们将原来的标准输出重定向到了out文件中,所以控制台只剩下了错误提示。并且当执行了追加操作时,out文件的内容非但没有被清空,反而又多了一条a.txt。
同理,我们也可以将错误输出重定向到文件中:
看到这里,朋友们可能会发现>out 2>err和我们在一开头提到的>/dev/null 2>&1已经很像了,别急,这待会再说。
chatgpt------'>'和'>>'都是用于将输出重定向到文件的符号,它们的区别
4.输入重定向
输入重定向的基本命令如下:
我们使用<对输入做重定向,如果符号左边没有写值,那么默认就是0。
我们这次以cat命令为例,如果cat后面没有跟文件名的话,那它的作用就是将标准输入(比如键盘)回显到标准输出(比如屏幕)上:
我们可以将利用输入重定向,将我们在键盘上敲入的字符写入到文件中。我们需要使用ctrl+c来结束输入:
好了,此时我们觉得自己在键盘上敲比较累,还是直接让cat读取一个文件吧。那么我们需要利用输入重定向:
out文件里面的内容被替换成了input文件里的内容。那么<<又是什么作用呢?我们再看:
我们看到,当我们输入完cat >out <<end,然后敲下回车之后,命令并没有结束,此时cat命令像一开始一样,等待你给它输入数据。然后当我们敲入end之后,cat命令就结束了。end之前输入的字符都已经被写入到了out文件中。这就是输入分割符的作用。
5.重定向绑定
开头提到的>/dev/null 2>&1。这条命令其实分为两命令,一个是>/dev/null,另一个是2>&1。
linux在执行shell命令之前,就会确定好所有的输入输出位置,并且从左到右依次执行重定向的命令,所以>/dev/null 2>&1的作用就是让标准输出重定向到/dev/null中(丢弃标准输出)**,然后错误输出由于重用了标准输出的描述符,所以错误输出也被定向到了/dev/null中,错误输出同样也被丢弃了。**执行了这条命令之后,该条shell命令将不会输出任何信息到控制台,也不会有任何信息输出到文件中。
>/dev/null
这条命令的作用是将标准输出1重定向到/dev/null中。/dev/null代表linux的空设备文件,所有往这个文件里面写入的内容都会丢失,俗称"黑洞"。那么执行了>/dev/null之后,标准输出就会不再存在,没有任何地方能够找到输出的内容。
2>&1
这条命令用到了重定向绑定,采用&可以将两个输出绑定在一起。这条命令的作用是错误输出将和标准输出同用一个文件描述符,说人话就是错误输出将会和标准输出输出到同一个地方。
>/dev/null 2>&1 和 2>&1 >/dev/null
>/dev/null 2>&1 和 >/dev/null 2>/dev/null
6.最常见的2>/dev/null详解
在Unix和类Unix系统中,2>/dev/null
是一种常用的 shell 命令语法,用于将标准错误(file descriptor 2)重定向到 /dev/null
设备,它被称为"null设备"。这条命令通常与其他命令一起使用,用来忽略错误信息的输出。现在,让我们逐一解释这个命令的各个部分:
-
2
: 在Unix和类Unix系统中,每个进程默认打开三个文件描述符:标准输入(0)、标准输出(1)和标准错误(2)。这里的2
代表标准错误流。 -
>
: 这个符号是重定向操作符。它将指定的输出(在这个情况下是标准错误)重定向到某个位置。 -
/dev/null
: 这是一个特殊的设备文件,通常被称为"空设备"或"黑洞"。向/dev/null
写入的数据都会被丢弃,读取/dev/null
会立即返回文件结束符。
因此,当你在命令行中使用 2>/dev/null
时,你实际上是在告诉 shell 忽略由命令生成的所有错误信息。错误信息通常会被显示在终端或者保存到文件中,但是当使用 2>/dev/null
时,错误信息就会被丢弃,你将不会看到任何错误信息。
例如,假设有一个命令 command
会产生输出和错误信息,你可以这样使用重定向来忽略错误信息:
sh
command 2>/dev/null
这样,command
的正常输出将会显示在终端上,但所有的错误信息都会被重定向到 /dev/null
,因此不会显示任何错误信息。
7.编译一个代码时,如何只打印标准错误输出
在编译代码时,如果您只想看到标准错误的输出,并忽略标准输出,您可以使用命令行重定向功能。Unix和类Unix系统(包括Linux和macOS)允许您控制程序的标准输出(stdout)和标准错误输出(stderr)。
标准输出的文件描述符是1,而标准错误的文件描述符是2。您可以将标准输出重定向到 /dev/null
,同时保留标准错误未重定向,这样就只会看到错误信息。
例如,如果您使用 gcc
来编译名为 example.c
的C语言程序,只想打印标准错误,可以使用以下命令:
sh
gcc example.c > /dev/null
在这个命令中:
gcc example.c
是编译命令。>
重定向操作符,后面跟的是目的地。/dev/null
是一个特殊的设备,当您将数据重定向到它时,数据会被丢弃。
将标准输出重定向到 /dev/null
的结果是,所有的编译输出(如果没有错误或警告)都不会显示。如果有错误或警告,它们会打印在终端上,因为标准错误没有被重定向。
如果您想要进一步的控制,可以将标准输出和标准错误分别重定向到不同的文件。例如:
sh
gcc example.c > out.txt 2> err.txt
这个命令会将所有的标准输出写入到 out.txt
文件中,所有的标准错误写入到 err.txt
文件中。如果 out.txt
和 err.txt
文件不存在,它们会被创建;如果已经存在,它们的内容会被覆盖。如果您想将输出追加到文件,可以使用 >>
来代替 >
。