2.1 标准I/O与重定向

标准I/O设备

    根据Linux的哲学思想:一切皆文件。当我们对问将进行处理的时候,系统会对每个打开的文件分配一个fd(file descriptor,文件描述符)。

    fd中,系统默认将“0”设置为标准输入(stdin),通常为键盘;                                                                        “1”设置为标准输入(stdout),通常为屏终端窗口;                                                            “ 2”设置为标准错误(stderr),通常为终端窗口。                                   另外3~9是保留标识符,可以把这些字符指定为临时标准输入、输出、错误进行连接。

文件描述符

     文件描述符的作用在于使进程与文件相连:


    内核中,对应于每个进程都有一个文件描述符表,表示这个进程打开的所有文件。文件描述表中每一项都是一个指针,指向一个用于描述打开文件文件对象表。

    file status flags:用于记录文件被打开来读的,还是写的。其实记录的就是open调用中用户指定的第2个参数
    current file offset:用于记录文件的当前读写位置(指针)。正是由于此字段的存在,使得一个文件被打开并读取后,下一次读取将从上一次读取的字符后开始读取
    v-node ptr:该字段是指针,指向v节点表的一个元素,从而关联了物理文件。

    需要注意的是,文件对象不是专属于某个进程的,不同进程的文件描述符表中的指针可以指向相同的文件对象,从而共享这个打开的文件。文件对象有引用计数,记录了引用这个文件对象描述符个数,只有当引用计数为0时,内核才销毁file对象,因此某个进程关闭文件,不影响与之共享同一个file对象的进程。

I/O重定向

    I/O重定向是将一个过程,将命令、程序或脚本的输出,作为输入发送到另外一个程序、文件、或命令。


标准输出(stdin)

    将标准输出结果默认输出

[root@CentOS6 ~]#ls /data
file0.txt   file1.txt  file3.txt  file5.txt  file7.txt  file9.txt
file10.txt  file2.txt  file4.txt  file6.txt  file8.txt
    将标准输出的结果重定向至文件中
[root@CentOS6 ~]#ls /data >std.out
[root@CentOS6 ~]#cat std.out 
file0.txt
file10.txt
file1.txt
file2.txt
file3.txt
file4.txt
file5.txt
file6.txt
file7.txt
file8.txt
file9.txt
    将标准输出的结果追加重定向至文件中
[root@CentOS6 ~]#pwd >>std.out
[root@CentOS6 ~]#cat std.out 
file0.txt
file10.txt
file1.txt
file2.txt
file3.txt
file4.txt
file5.txt
file6.txt
file7.txt
file8.txt
file9.txt
/root

标准错误输出(stderr)

    将标准错误输出结果默认输出

[root@CentOS6 ~]#ls /erreo
ls: cannot access /erreo: No such file or directory
    将标准错误输出的结果重定向至文件中
[root@CentOS6 ~]#ls /erreo 2>err.out
[root@CentOS6 ~]#cat err.out 
ls: cannot access /erreo: No such file or directory
    将标准错误输出的结果追加重定向至文件中
[root@CentOS6 ~]#ls /STDERR 2>>err.out
[root@CentOS6 ~]#cat err.out 
ls: cannot access /erreo: No such file or directory
ls: cannot access /STDERR: No such file or directory

    当标准输入与标准错误输出同时存在时

[root@CentOS6 ~]#ls /data /error >all.out 2>&1
[root@CentOS6 ~]#cat all.out 
ls: cannot access /error: No such file or directory
/data:
file0.txt
file10.txt
file1.txt
file2.txt
file3.txt
file4.txt
file5.txt
file6.txt
file7.txt
file8.txt
file9.txt
[root@CentOS6 ~]#ls /data /error &>all.out
[root@CentOS6 ~]#cat all.out 
ls: cannot access /error: No such file or directory
/data:
file0.txt
file10.txt
file1.txt
file2.txt
file3.txt
file4.txt
file5.txt
file6.txt
file7.txt
file8.txt
file9.txt
    在第一种方法下,想要将标准输出和标准错误输出都输出至目标,2>&1必须写在后面,因为
stdout=screen
errout=screen
res=stdres+errres
#一同输出至目标
res-->out
stdout=out.log
stdres-->stdout=out.log
errres-->stdout=out.log
end
#失败
res-->out
errres--stdout=screen
stdout=out.log
stdres-->stdout=out.log
end

标准输入(stdin)

    使用默认输入读入数据

[root@CentOS6 ~]#cat
This is a stdin!
This is a stdin!
    使用输入重定向读入数据
[root@CentOS6 ~]#cat < /data/std.in 
This is a stdin!

    可以使用">> 文件名"来创建新文件,如果文件已经存在,则不创建,且不改变原文件的任何属性。使用"> 文件名"来清空文件。


    tr命令可以对来自标准输入的字符进行替换、压缩和删除。

    语法:tr [选项] [字符集] [字符集]

[root@CentOS6 ~]#echo "HELLO WORLD" | tr 'A-Z' 'a-z'
hello world

    选项

-c:取代所有不属于第一字符集的字符;
-d:删除所有属于第一字符集的字符;
-s:把连续重复的字符以单独一个字符表示;
-t:先删除第一字符集较第二字符集多出的字符。

[:alnum:]:字母和数字
[:alpha:]:字母
[:cntrl:]:控制(非打印)字符
[:digit:]:数字
[:graph:]:图形字符
[:lower:]:小写字母
[:print:]:可打印字符
[:punct:]:标点符号
[:space:]:空白字符
[:upper:]:大写字母
[:xdigit:]:十六进制字符
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值