Linux Shell 环境中支持输入输出重定向,用符号<和>来表示。0、1和2分别表示标准输入、标准输出和标准错误信息输出,可以用来指定需要重定向的标准输入或输出,比如 2>a.txt 表示将错误信息输出到文件a.txt中。

同时,还可以在这三个标准输入输出之间实现重定向,比如将错误信息重定向到标准输出,可以用 2>&1来实现。

Linux下还有一个特殊的文件/dev/null,它就像一个无底洞,所有重定向到它的信息都会消失得无影无踪。这一点非常有用,当我们不需要回显程序的所有信息时,就可以将输出重定向到/dev/null。

如果想要正常输出和错误信息都不显示,则要把标准输出和标准错误都重定向到/dev/null, 例如:

# ls 1>/dev/null 2>/dev/null

还有一种做法是将错误重定向到标准输出,然后再重定向到 /dev/null,例如:

# ls >/dev/null 2>&1


1 
    COMMAND_OUTPUT  
   > 
   
 
   2 
     
   # 
    重定向stdout到一个文件 
   . 
   
 
   3 
     
   # 
    如果没有这个文件就创建 
   , 
    否则就覆盖 
   . 
   
 
   4 
    
 
   5 
    ls -lR  
   > 
     
   dir 
   - 
   tree 
   . 
   list
 
   6 
     
   # 
    创建一个包含目录树列表的文件 
   . 
   
 
   7 
    
 
   8 
    :  
   > 
    filename
 
   9 
     
   # 
     
   > 
    会把文件 
   " 
   filename 
   " 
   截断为0长度 
   . 
   
 
   10 
     
   # 
    如果文件不存在 
   , 
    那么就创建一个0长度的文件 
   ( 
   与'touch'的效果相同 
   ). 
   
 
   11 
     
   # 
    : 是一个占位符 
   , 
    不产生任何输出 
   . 
   
 
   12 
    
 
   13 
     
   > 
    filename 
 
   14 
     
   # 
     
   > 
    会把文件 
   " 
   filename 
   " 
   截断为0长度 
   . 
   
 
   15 
     
   # 
    如果文件不存在 
   , 
    那么就创建一个0长度的文件 
   ( 
   与'touch'的效果相同 
   ). 
   
 
   16 
     
   # 
     
   ( 
   与上边的 
   " 
   : > 
   " 
   效果相同 
   , 
    但是在某些shell下可能不能工作 
   .) 
   
 
   17 
    
 
   18 
    COMMAND_OUTPUT  
   >> 
   
 
   19 
     
   # 
    重定向stdout到一个文件 
   . 
   
 
   20 
     
   # 
    如果文件不存在 
   , 
    那么就创建它 
   , 
    如果存在 
   , 
    那么就追加到文件后边 
   . 
   
 
   21 
    
 
   22 
    
 
   23 
     
   # 
    单行重定向命令 
   ( 
   只会影响它们所在的行 
   ) 
   :
 
   24 
     
   # 
    --------------------------------------------------------------------
 
   25 
    
 
   26 
     
   1 
   > 
   filename
 
   27 
     
   # 
    重定向stdout到文件 
   " 
   filename 
   " 
   . 
   
 
   28 
     
   1 
   >> 
   filename
 
   29 
     
   # 
    重定向并追加stdout到文件 
   " 
   filename 
   " 
   . 
   
 
   30 
     
   2 
   > 
   filename
 
   31 
     
   # 
    重定向stderr到文件 
   " 
   filename 
   " 
   . 
   
 
   32 
     
   2 
   >> 
   filename
 
   33 
     
   # 
    重定向并追加stderr到文件 
   " 
   filename 
   " 
   . 
   
 
   34 
    & 
   > 
   filename
 
   35 
     
   # 
    将stdout和stderr都重定向到文件 
   " 
   filename 
   " 
   . 
   
 
   36 
    
 
   37 
     
   #============================================================================== 
   
 
   38 
     
   # 
    重定向stdout 
   , 
    一次一行 
   . 
   
 
   39 
    LOGFILE 
   = 
   script 
   . 
   log
 
   40 
    
 
   41 
     
   echo 
     
   " 
   This statement is sent to the log file, \"$LOGFILE\". 
   " 
     
   1 
   >$ 
   LOGFILE
 
   42 
     
   echo 
     
   " 
   This statement is appended to \"$LOGFILE\". 
   " 
     
   1 
   >>$ 
   LOGFILE
 
   43 
     
   echo 
     
   " 
   This statement is also appended to \"$LOGFILE\". 
   " 
     
   1 
   >>$ 
   LOGFILE
 
   44 
     
   echo 
     
   " 
   This statement is echoed to stdout, and will not appear in \"$LOGFILE\". 
   " 
   
 
   45 
     
   # 
    每行过后 
   , 
    这些重定向命令会自动 
   " 
   reset 
   " 
   . 
   
 
   46 
    
 
   47 
    
 
   48 
    
 
   49 
     
   # 
    重定向stderr 
   , 
    一次一行 
   . 
   
 
   50 
    ERRORFILE 
   = 
   script 
   . 
   errors
 
   51 
    
 
   52 
    bad_command1  
   2 
   >$ 
   ERRORFILE  
   # 
    错误消息发到 
   $ 
   ERRORFILE中 
   . 
   
 
   53 
    bad_command2  
   2 
   >>$ 
   ERRORFILE  
   # 
    错误消息添加到 
   $ 
   ERRORFILE中 
   . 
   
 
   54 
    bad_command3  
   # 
    错误消息echo到stderr 
   , 
   
 
   55 
     
   #+ 
    并且不出现在 
   $ 
   ERRORFILE中 
   . 
   
 
   56 
     
   # 
    每行过后 
   , 
    这些重定向命令也会自动 
   " 
   reset 
   " 
   . 
   
 
   57 
     
   #============================================================================== 
   
 
   58 
    
 
   59 
    
 
   60 
    
 
   61 
     
   2 
   > 
   & 
   1 
   
 
   62 
     
   # 
    重定向stderr到stdout 
   . 
   
 
   63 
     
   # 
    得到的错误消息与stdout一样 
   , 
    发送到一个地方 
   . 
   
 
   64 
    
 
   65 
    i 
   > 
   &j
 
   66 
     
   # 
    重定向文件描述符i 到 j 
   . 
   
 
   67 
     
   # 
    指向i文件的所有输出都发送到j中去 
   . 
   
 
   68 
    
 
   69 
     
   > 
   &j
 
   70 
     
   # 
    默认的 
   , 
    重定向文件描述符1 
   ( 
   stdout 
   ) 
   到 j 
   . 
   
 
   71 
     
   # 
    所有传递到stdout的输出都送到j中去 
   . 
   
 
   72 
    
 
   73 
     
   0 
   < 
    FILENAME
 
   74 
     
   < 
    FILENAME
 
   75 
     
   # 
    从文件中接受输入 
   . 
   
 
   76 
     
   # 
    与 
   " 
   > 
   " 
   是成对命令 
   , 
    并且通常都是结合使用 
   . 
   
 
   77 
     
   # 
   
 
   78 
     
   # 
    grep search-word  
   < 
   filename
 
   79 
    
 
   80 
    
 
   81 
    [j] 
   <> 
   filename
 
   82 
     
   # 
    为了读写 
   " 
   filename 
   " 
   , 
    把文件 
   " 
   filename 
   " 
   打开 
   , 
    并且分配文件描述符 
   " 
   j 
   " 
   给它 
   . 
   
 
   83 
     
   # 
    如果文件 
   " 
   filename 
   " 
   不存在 
   , 
    那么就创建它 
   . 
   
 
   84 
     
   # 
    如果文件描述符 
   " 
   j 
   " 
   没指定 
   , 
    那默认是fd  
   0 
   , 
    stdin 
   . 
   
 
   85 
     
   # 
   
 
   86 
     
   # 
    这种应用通常是为了写到一个文件中指定的地方 
   . 
   
 
   87 
     
   echo 
     
   1234567890 
     
   > 
    File  
   # 
    写字符串到 
   " 
   File 
   " 
   . 
   
 
   88 
    exec  
   3 
   <> 
    File  
   # 
    打开 
   " 
   File 
   " 
   并且给它分配fd  
   3 
   . 
   
 
   89 
    read -n  
   4 
     
   < 
   & 
   3 
     
   # 
    只读4个字符 
   . 
   
 
   90 
     
   echo 
    -n  
   . 
     
   > 
   & 
   3 
     
   # 
    写一个小数点 
   . 
   
 
   91 
    exec  
   3 
   > 
   &-  
   # 
    关闭fd  
   3 
   . 
   
 
   92 
    cat File  
   # 
     
   ==> 
     
   1234.67890 
   
 
   93 
     
   # 
    随机存储 
   . 
   
 
   94 
    
 
   95 
    
 
   96 
    
 
   97 
    |
 
   98 
     
   # 
    管道 
   . 
   
 
   99 
     
   # 
    通用目的的处理和命令链工具 
   . 
   
 
   100 
     
   # 
    与 
   " 
   > 
   " 
   很相似 
   , 
    但是实际上更通用 
   . 
   
 
   101 
     
   # 
    对于想将命令 
   , 
    脚本 
   , 
    文件和程序串连起来的时候很有用 
   . 
   
 
   102 
    cat * 
   . 
   txt |  
   sort 
    | uniq  
   > 
    result-file
 
   103 
     
   # 
    对所有的 
   . 
   txt文件的输出进行排序 
   , 
    并且删除重复行 
   , 
   
 
   104 
     
   # 
    最后将结果保存到 
   " 
   result-file 
   " 
   中 
   . 
   



demo1 :

 
   1 
     
   command 
     
   < 
    input-file  
   > 
    output-file
 
   2 
    
 
   3 
    command1 | command2 | command3  
   > 
    output-file


demo2 :
 
   1 
    ls -yz  
   >> 
     
   command 
   . 
   log  
   2 
   > 
   & 
   1 
   
 
   2 
     
   # 
    将错误选项 
   " 
   yz 
   " 
   的结果放到文件 
   " 
   command.log 
   " 
   中 
   . 
   
 
   3 
     
   # 
    因为stderr被重定向到这个文件中 
   , 
   
 
   4 
     
   #+ 
    所有的错误消息也就都指向那里了 
   . 
   
 
   5 
    
 
   6 
     
   # 
    注意 
   , 
    下边这个例子就不会给出相同的结果 
   . 
   
 
   7 
    ls -yz  
   2 
   > 
   & 
   1 
     
   >> 
     
   command 
   . 
   log
 
   8 
     
   # 
    输出一个错误消息 
   , 
    但是并不写到文件中 
   . 
   
 
   9 
    
 
   10 
     
   # 
    如果将stdout和stderr都重定向 
   , 
   
 
   11 
     
   #+ 
    命令的顺序会有些不同 
   .