前言
背景:我们在平时中常见到诸如
Linux常见的命令>
、1>/dev/null
、2>&1
都是指的什么呢?
>
代表重定向符
1>/dev/null
代表标准输出重定向到空设备文件,也就是不输出也不显示任何信息。其中 :1 代表标准输出,/dev/null 代表空设备文件。
2>&1
代表标准错误重定向且等同于标准输出,也就是标准错误也重定向到空设备中。其中:2代表标准错误,& 代表等同于。
即command 1>/dev/null 2>&1
就是不显示任何标准输出和标准错误
关于标准输入、输出和错误
3种文件描述符
一般情况下,每个 Unix/Linux 命令运行时都会打开三个文件:
标准输入文件(stdin):stdin的文件描述符为0,Unix/Linux 程序默认从stdin读取数据,标准输入就是命令的输入,默认指向键盘。标准输出文件(stdout):stdout 的文件描述符为1,Unix/Linux 程序默认向stdout输出数据,标准输出就是命令的输出,默认指向终端屏幕。标准错误文件(stderr):stderr的文件描述符为2,Unix/Linux 程序会向stderr流中写入错误信息,标准错误是命令错误信息的输出,默认指向屏幕。
默认情况下,command > file
将 stdout 重定向到 file,command < file
将stdin 重定向到 file。
6种重定向符
命令 < 文件
将文件作为命令的输入,如:mail -s "mymail" IloveChina@ < mailfile
将文件mailfile
作为信件内容发送。
命令 > 文件
将命令的输出结果送到指定文件中,默认为标准输出重定向(即1>
),且覆盖原文件内容。
命令 >! 文件
将命令的输出结果送到指定文件中,若指定文件存在,则覆盖。
命令 >& 文件
将命令的输出结果写入到指定文件中
命令 >> 文件
将命令的输出结果附加到指定文件中(追加)
命令 >>& 文件
将命令的 产生的任何输出结果附加到指定文件中
常用的有2、4、5,重定向的使用需要注意:
标准输入0、标准输出1、标准错误2需要分别重定向,一个重定向只能改变它们其中一个。标准输入和标准输出可以省略。(当出现重定向符号左侧时)文件描述符在重定向符号左侧直接写即可,在右侧时前面加&。文件描述符与重定向符号之间不能有空格。
例子
我们来解析一些例子:
# /home/pi需要根据用户名修改,且已存在temp目录,不存在则需 mkdir temp 创建新目录# 将字符test输入到test.txtpi@raspberrypi:/dev $ echo "test" > /home/pi/temp/test.txtpi@raspberrypi:/dev $ cat /home/pi/temp/test.txttest# 将字符test2222输入到已存在的test.txt,>覆盖原内容,>>追加原内容pi@raspberrypi:/dev $ echo "test2222" > /home/pi/temp/test.txtpi@raspberrypi:/dev $ cat /home/pi/temp/test.txttest2222pi@raspberrypi:/dev $ echo "test2222" >> /home/pi/temp/test.txtpi@raspberrypi:/dev $ cat /home/pi/temp/test.txttest2222test2222# 将标准错误输出重定向到 err_out.txt 文件中,由于不存在test目录而不能创建文件导致错误,使用2>重定向错误到文件中,则控制台不显示错误输出# 注意:前提要不存在test目录pi@raspberrypi:~ $ touch /home/test/test/test.txt 2> err_out.txtpi@raspberrypi:~ $ cat err_out.txttouch: cannot touch '/home/test/test/test.txt': No such file or directory# 将标准错误重定向到标准输出,将标准输出重定向到空设备文件pi@raspberrypi:~ $ ls > /dev/null 2>&1 pi@raspberrypi:~ $ ls 2&>1 > /dev/null # 两者等价