I/O重定向;


    程序:指令+数据 读入数据:Input 输出数据:Output  

    打开的文件都有一个fd: file descriptor (文件描述符)

    Linux给程序提供三种I/O设备  

    标准输入(STDIN)-0 默认接受来自键盘的输入  

    标准输出(STDOUT)-1 默认输出到终端窗口  

    标准错误(STDERR)-2 默认输出到终端窗口  

    I/O重定向:改变默认位置

定向输出 ">"

    STDOUT和STDERR可以被重定向到文件: 命令 操作符号 文件名 支持的操作符号包括:

     > 把STDOUT(标准输出)重定向到文件 

    2> 把STDERR(标准错误)重定向到文件 

    &> 把所有输出重定向到文件

    > 文件内容会被覆盖

    # set -C: 禁止将内容覆盖已有文件,但可追加

    强制覆盖:>|

    # set +C: 允许覆盖 

    >>  原有内容基础上,追加内容

  标准输出和错误输出各自定向至不同位置: 

       COMMAND > /path/to/file.out 2> /path/to/error.out 

  ():合并多个程序的STDOUT ( cal 2007 ; cal 2008 ) > all.txt

定向输入 "<"

     使用<来重定向标准输入

比如说,我们执行一些命令的时候需要添加一些参数,但是参数太多,不能一条条去写太浪费时间,这时,我们把这些参数写到一个文本当中,用到定向输入"<"会非常的方便,

假设a.txt中没有数据,b.txt中有数据,那我们用下边这个命令,就可以吧b中的数据,写入到a中

    cat > a.txt < b.txt 


重定向和标准输入/出、标准错误的结合用法;

首先, 什么叫标准输出,就是说,执行命令后出现的正常参数或者说数据,例如;执行ls 就会列出我当前目录下的文件,

[root@centous1 soft]# ls
123.txt  b  c

或者cat一个文件,让其显示出来文本的内容,这些正常出现的,就叫做标准输出,我们如果需要把数据定向到某个地方,可以用">"

[root@centous1 soft]# ls > d
[root@centous1 soft]# ls
123.txt  b  c  d
[root@centous1 soft]# cat d
123.txt
b
c
d

如果是错误的提示信息,就叫做标准错误,例如

[root@centous1 soft]# ls -
ls: 无法访问-: 没有那个文件或目录

那我们有的时候不想看到那些错误的输出,也可以定向到某个地方;但是格式不一样了

[root@centous1 soft]# ls - 2>f
[root@centous1 soft]# ls
123.txt  b  c  d  f
[root@centous1 soft]# cat f
ls: 无法访问-: 没有那个文件或目录

这个命令在 ">" 符号之前多了一个 "2","2>" 表示将标准错误输出重定向

如果,我想把标准输出和标准错误都定向到一个文件中,怎么办?用以下命令

commend > filename 2>&1

这里的&表示让shell理解我们是要把标准错误当成标准输出,写入到flie中

如果那些信息都不重要,那就都扔掉

commend > /dev/null

另外一个非常有用的重定向操作符是 "-",请看下面这个例子

$ (cd /source/directory && tar cf - . ) | (cd /dest/directory && tar xvfp -)
该命令表示把 /source/directory 目录下的所有文件通过压缩和解压,快速的全部移动到 /dest/directory 目录下去,这个命令在 /source/directory 和 /dest/directory 不处在同一个文件系统下时将显示出特别的优势。
下面还几种不常见的用法:
n<&- 表示将 n 号输入关闭 <&- 表示关闭标准输入(键盘) n>&- 表示将 n 号输出关闭 >&- 表示将标准输出关闭


重定向标准输入

   cat命令可以接受一组文件为参数,将这些文件复制到标准输出。我们前面的例子中已经多次使用到cat命令来将文本文件的内容读取到屏幕上。cat还有一个很重要的功能:接受一组文件,然后通过重定向将他们重新组合到一个文件中。我们看一个例子

[root@centous1 soft]# echo aaaaaaa > a
[root@centous1 soft]# ls
123.txt  a
[root@centous1 soft]# cat a
aaaaaaa
[root@centous1 soft]# echo b > b
[root@centous1 soft]# echo bbbbbbb > b
[root@centous1 soft]# cat b
bbbbbbb
[root@centous1 soft]# cat a b > c
[root@centous1 soft]# cat c
aaaaaaa
bbbbbbb

这个命令将ls1和ls2文件中的内容合并到ls文件中了。cat命令的这种功能不仅仅适用于文本文件,同样对二进制文件有效。这个场景主要在将多个压缩包文件合并到一个压缩包中用到。