重定向的含义及管道、tee命令的使用
最后更新于
这有帮助吗?
最后更新于
这有帮助吗?
程序是由数据和指令组成的,程序可理解为对数据的加工,就好比计算器,它本身是个程序,在计算器里面输入1 + 1,程序处理并输出结果2,这个结果也是个数据。
那么程序在数据加工时,首先需要加载数据或获取数据,程序本身都有默认的获取数据的方式,通常默认设备是键盘。例如,grap /etc/passwd,grep是命令程序,而/etc/passwd则是文件,也就是数据,那么grep程序要对/etc/passwd文件的数据进行加工处理时,grep需要获取/etc/passwd的文件数据,而这些文件的数据是程序的数据输入,可以把这一种数据输入的方式,称为“输入重定向”。
程序对数据进行加工处理后,需要把结果输出,通常程序输出设备为显示器,如果需要把结果永久存储起来,则需要把结果指向文件存储。这个对程序输出做重新指定的操作,称为“输出重定向”。
输入重定向主要更改程序的数据输入方式
将命令中接收输入的途径由默认的键盘改为其他文件,而不是等待从键盘输入。
定义:输出重定向是指将命令的正常输出结果保存到指定的文件中,而不是直接显示在显示器的屏幕上。
输出重定向使用 “>” “>>”操作符号。
语法:
>文件名,表示将标准输出的内容,写到后面的文件中,如果此文件名已经存在,将会覆盖原文件中的内容,若此文件不存在,则会以此文件名写新建文件。
>>文件名,表示将标准输出的内容,以追加形式写到后面的文件中。若此文件不存在,则会以此文件名新建该文件。
EOF本意是End Of File,表明到了文件末尾。“EOF”通常与“<<”结合使用,“<<EOF”表示后续的输入作为子命令或者子Shell的输入,直到命令又遇到“EOF”,再次返回到主调Shell,可将其理解为分界符(delimiter)。既然是分界符,那么形式自然不是固定的,这里可以将“EOF”进行自定义,但是前后的分界符必须成对出现且不能和Shell命令冲突。
以<<EOF开始,以EOF结尾
以ccc作为分界符
在脚本中可以通过输入重定向来打印消息菜单。
在使用的时候需要在“<<”右边跟一对终止符。终止符是可以自定义的
将命令执行过程中出现的错误信息(选项或参数错误)保存到指定的文件中,而不是直接显示到显示器。
在实际应用中,错误重定向可以用来收集执行的错误信息,为排错提供依据。对于Shell脚本还可以将无关紧要的错误信息重定向到空文件/dev/null中,以保持脚本输出的简洁。
将错误显示的内容和正确显示的内容分开
注意:使用“2>”操作符时,像使用“>”操作符时一样,会覆盖目标文件的内容,若要追加而不覆盖文件的内容可使用“2>>”操作符。
1.可以把/dev/null文件看作“黑洞”(是个特殊设备),所有写入的内容都会永远丢失,而尝试读取内容则什么也读不到,然而/dev/null文件对命令行和脚本都非常有用。
2./dev/zero,在类UNIX操作系统中是一个特殊的设备文件,读取该文件的时候,它会提供无限的空字符(NULL,ASCII NUL,0x00)。典型用法是用它来产生一个特定大小的空白文件。
使用dd命令产生一个50MB的文件
dd命令:用于转换并复制一个文件。参数如下。
(1)if代表输入文件。如果不指定if,默认就会从stdin中读取输入。
(2)of代表输出文件。如果不指定of,默认就会将stdout作为默认输出。
(3)bs代表以字节为单位的块大小。
(4)count代表被复制的块数。
对于程序输出的结果,正确的结果内容写入一个文件,错误的结果内容写入另一个文件。
把正确的程序执行结果重定向到标准错误的结果内,输入一个相同的位置或文件。
1>﹠2把标准输出重定向到标准错误,如图
把错误的程序执行结果重定向到标准输出的程序结果内,输入一个相同的位置或文件。
2>﹠1把标准错误重定向到标准输出,如图
在生产环境中的Shell脚本中的>/dev/null 2>& 1是什么意思?
使用管道传输数据,如图
管道命令只处理前一个命令的正确输出,不处理错误输出。
管道右边的命令,必须是能够接收标准输入的数据流的命令。
管道符可以把两条命令连起来,并可以连接多个命令。
管道能够使进程之间完成数据传输,在A进程处理完数据后,把输出的结果通过管道传输给B进程。A进程输出的结果为“标准输出”,在B进程接收时,则为“标准输入”。因此,管道后面的需要支持接收“标准输入”的数据流。
功能:读取标准输入的数据,并将其内容输出成文件。
tee命令会从标准输入设备读取数据,将其内容输出到标准输出设备,同时保存成文件,如图