Linux重定向与管道
标准输入 标准输出和标准错误
基本思想:每个基于文本的程序都可以从任何源接受输入,并向任何目标输出
标准输入指的是一种读取数据的通用办法,标准输出有两种,一种是标准输出,另一种是标准错误
而输入输出其实正常情况下有shell决定。为了保证程序的输出,需要告诉shell将输出目标设置成文件。
重定向标准输出
在登陆时,shell会自动将标准输入设置成键盘,将标准输出和标准错误设置成屏幕。
但是每次输入命令时,可以告诉shell在此命令执行期间更换输入输出对象。
如果想把一个命令输出送到一个文件中,例如sort命令 可以写成 sort > names
以这种命令输出时,如果文件不存在,shell会自动创建这个文件。如果文件存在,那他将会把文件内容全部清空然后再把内容输入到里面去
如果我们只想追加内容到这个文件中,可以用 >> 。如果文件不存在,这个命令也会创建新文件,如果存在,那么会追加内容到后面。
如果取消清空文件重新输入的选项,可以设置nonclobber选项。但是设置完之后,如果确实想替换掉这个文件,可以临时忽略掉noclobber,这时需要用>|
替换 >
重定向标准输入
符号: <
左边是你要运行的程序,右边是你有读入数据的文件
例如 sort < /etc/passwd
标准输入和标准输出可以同时指定
例如 sort < rawdata > report,这个命令会把rawdata中的数据给sort处理,然后把结果给report文件
重定向标准错误
shell提供两种输出目标,标准输出和标准错误。正常情况下,两种输出同时显示在屏幕上,在需要时,可以把两种输出分隔开。
首先对unix处理I/O过程了解。每个输入源和每个输出目标都有一个唯一的数字标识,,这个数字 称为文件描述符。例如一个进程可能从#8中读取数据,并将文件写入#6中
例如为了将输出写入到文件8中,可以sort 8> results,results就是第8个文件
默认情况下,Unix为每个进程提供三个预定义的文件描述符。而且大多数时候都可以使用。0代表标准输入,1代表标准输出,3代表标准错误。
所以要想重定向输入,可以用 0<
而要想重定向标准输出,可以用 1> ,这样错误信息就会留在屏幕上便于我们查看,而输出信息在文件中。如果想让标准错误在文件中,可以 2>
此外,平常写的 > 实际上代表的是 1>
子shell
进程就是加载到内存中准备运行的程序,当进程需要启动另一个进程的时候,这个进程创建了一个副本进程,原始跌进程叫做父进程,而这个进程叫做子进程。
而子进程一旦结束,优惠唤醒父进程继续执行命令,此时子进程消失。
子shell指的是在父shell中重新开一个shell,这样在子shell中造成的改变不会影响父shell,甚至是环境变量也一样,除非把它写入初始化文件中,不然这个全局变量也会随着子shell进程的结束而消亡。
如果有时你想在子shell中执行一条指令,又不想启动一个全新的shell,那么一个办法就是在外面加上小括号(),例如 (date)
组合标准重定向输出和错误
在bash中,基本思想是建议将一种类型的输出重定向到一个文件,然后再追加
command x> outputfile y>&x
>&
符号的意思是替代
y>& x的意思是把2的输出发送给1相同的位置。
例: sort 2>&1 >output 这个意思是把2的输出发送到与一相同的位置,而一是发送到屏幕的,于是2也发送到屏幕了
抛弃输出
为什么要抛弃输出呢?
有时候,需要运行一个程序。因为可能你并不关心这个文件的输出。有时候,可能希望查看文件正常输出,而不关心错误信息。
那么这个时候只需要重定向输出到 /etc/null即可。这个文件的特殊之处在于发送给他的任何东西都会消失。所以 它有个奇怪的名字叫做 位桶(bit bucket)
管道线
管道线的作用就是让各个程序组合发挥作用
shell允许创建一系列的命令,在这一系列的命令中,一个命令的标准输出可以发送给下一个程序的标准输入。当这样做时,两个程序之间的连接就是管道,而命令序列本身叫做管道线。
在创建管道线时,只需将希望键入的命令用竖线| (管道符号) 分隔开即可
能从标准输入读取文本,并向标准输出写入文本的程序,称为过滤器。
管道线分流 tee
有时候,可能希望把程序的输出发送到两个地方
语法: tee [-a] file…
file就是希望将数据发送到的文件的名称
例:cat name1 name2 | tee masterlist | grep Harley
这个指令中的tee 会将输出保存到masterlist中并且将cat的输出给grep
同样,如果这个文件存在,那么tee将会重写这个文件。如果想要追加内容,那么可以tee -a(append)