什么是重定向
在讨论重定向之前先得知道标准输入、标准输出和标准错误输错,标准输入就是从输入设备读取信息,如键盘。标准输出和标准错误输出默认都是将信息输出到屏幕上来。只不过一个是命令执行后输出的正确信息,一个是输出的错误信息。
可以知道在输出中不管正确与否都会把信息输出到屏幕上,那么还有没有更好的方法将两者区分开或者输出到不同地方呢?当然有,那就是用重定向,重定向可以将某些信息输出到文件或其他设备中去。简而言之就是,重定向就是将某些信息重新输出到另一个地方。
重定向中所用到的符号
标准输入重定向
简而言之就是不使用系统提供的标准输入,而使用指定的文件充当标准输入设备,可以用<或<<符来改变标准设备。比如cat命令默认会接受键盘的输入,并显示到终端到。但是可以通过<符号指定标准设备,比如指定标准输入设备为文件。
cat < /etc/my.cnf
上面的代码就会将/etc/my.cnf文件作为输入设备,并显示到终端。
标准输出重定向
输出重定向简而言之就是把输出重定向到某个地方,如文件等。而不是默认输出到终端,显示到屏幕上。
比如我们输入ll,那么终端控制台上就会显示当前目录下的所有目录以及文件。若想输出到其他地方,我们看用>或>>进行重定向。当然也可以把1加上,用1>和1>>,通常系统默认的是1。
- ll > ll.txt 或者ll 1> ll.txt
- ls >> ls.txt 或者 ls 1>> ls.txt
- cat > newfile << "eof" #当输入eof时结束
- cat > newfile < /etc/ngixn/nginc.conf
注意>>是往文件中追加内容,而不会覆盖原有的内容。当然往文件中追加还有很多方式,如下面两种也是往文件中追加,只不过结合了管道操作。
- ls | tee -a ls.txt
- echo ls | tee -a go.mod
标准错误输出重定向
上面的提到的都是响应正确后,把数据进行重定向到某个地方,那么如果失败了呢,又该如何操作,也就是标准错误输出重定向该如何处理。
上面以及提到过的重定向中所用到的符号,标准错误输出重定向,可以用2>或者2>>来操作,道理和上面的标准输出重定向一样,前者是以覆盖的方式将数据重定向到某个地方,后者是以追加的方式。
- docker rmi mysql > temp.txt 2>&1
表示将不管标准输出还是标准错误输出重定向到temp.txt文件中。
2>&1就是将标准错误输出重定向到标准输出,也就是说标准错误输出等同于正确标准输出,在这里,我们并不关心是标准输出还是标准错误输出,我们统一将他们放到一个文件中。注意2>&1之间不能有空格。
- docker rmi aliyunImage 2> /dev/null
表示把输出的错误信息丢弃。
注:/dev/null 代表空设备文件 ,所有写入这个设备文件的数据都会被丢弃。当我 们想丢弃某些错误输出的时候可以用这个操作。
为什么要使用重定向
- 执行某些命令后,不希望结果输出到屏幕上,而需要永久性记录下来。
- 执行某些命令后,若遇到不关心的错误信息,可以用2>/dev/null丢弃。
- 后台执行中的程序,不希望它干扰屏幕的输出,可以用重定向。
- 输入希望不仅仅是从键盘读取输入,可能是从文件等地方输入。