zoukankan      html  css  js  c++  java
  • Linux中输入输出重定向的问题

     
    Linux 命令默认从标准输入设备(stdin)获取输入,将结果输出到标准输出设备(stdout)显示。一般情况下,标准输入设备就是键盘,标准输出设备就是终端,即显示器。
    输出重定向:命令的输出不仅可以是显示器,还可以很容易的转移向到文件,这被称为输出重定向。
     
    命令输出重定向的语法为:
    1. $ command > file
    这样,输出到显示器的内容就可以被重定向到文件。
     
    例如下面的命令在显示器上不会看到任何输出:
    1. $ who > users
    打开 users 文件,可以看到下面的内容:
     
    输出重定向会覆盖文件内容,请看下面的例子:
    $ echo line 1 > users
    $ cat users
    line 1
     
    如果不希望文件内容被覆盖,可以使用 >> 追加到文件末尾,例如:
    $ echo line 2 >> users
    $ cat users
    line 1
    line 2
     
    输入重定向
    和输出重定向一样,Unix 命令也可以从文件获取输入,语法为:
    1. command < file
    这样,本来需要从键盘获取输入的命令会转移到文件读取内容。
     
    注意:输出重定向是大于号(>),输入重定向是小于号(<)。
     
    例如,计算 users 文件中的行数,可以使用下面的命令:
    $ wc -l users 
     
    也可以将输入重定向到 users 文件:
    $ wc -l < users 
     
    wc命令可以输出指定文件的字节数,单词书,行数
    注意:上面两个例子的结果不同:第一个例子,会输出文件名;第二个不会,因为它仅仅知道从标准输入读取内容。
    重定向深入讲解
    一般情况下,每个 Linux 命令运行时都会打开三个文件:
    • 标准输入文件(stdin):stdin的文件描述符为0,Unix程序默认从stdin读取数据。
    • 标准输出文件(stdout):stdout 的文件描述符为1,Unix程序默认向stdout输出数据。
    • 标准错误文件(stderr):stderr的文件描述符为2,Unix程序会向stderr流中写入错误信息。
     
    默认情况下,command > file 将 stdout 重定向到 file,command < file 将stdin 重定向到 file。
     
    如果希望 stderr 重定向到 file,可以这样写:
    1. $command 2 > file
    如果希望 stderr 追加到 file 文件末尾,可以这样写:
    1. $command 2 >> file
    2 表示标准错误文件(stderr)。
     
    如果希望将 stdout 和 stderr 合并后重定向到 file,可以这样写:
    1. $command > file 2>&1
    1. $command >> file 2>&1
    如果希望对 stdin 和 stdout 都重定向,可以这样写:
    1. $command < file1 >file2
    command 命令将 stdin 重定向到 file1,将 stdout 重定向到 file2。
    不论输出标准输入或标准输出还是标准错误文件都可以输入到file中。你可以这样写:
    1. $command &>>file
     
     
    命令
    说明
    command > file
    将输出重定向到 file。
    command < file
    将输入重定向到 file。
    command >> file
    将输出以追加的方式重定向到 file。
    n > file
    将文件描述符为 n 的文件重定向到 file。
    n >> file
    将文件描述符为 n 的文件以追加的方式重定向到 file。
    n >& m
    将输出文件 m 和 n 合并。
    n <& m
    将输入文件 m 和 n 合并。
    << tag
    将开始标记 tag 和结束标记 tag 之间的内容作为输入。
    Here Document
    Here Document 目前没有统一的翻译,这里暂译为”嵌入文档“。Here Document 是 Shell 中的一种特殊的重定向方式,它的基本的形式如下:
    1. command << EOF
    2. document
    3. EOF
    它的作用是将两个 delimiter 之间的内容(document) 作为输入传递给 command。
     
    注意:
    • 结尾的EOF 一定要顶格写,前面不能有任何字符,后面也不能有任何字符,包括空格和 tab 缩进。
    • 开始的EOF前后的空格会被忽略掉。
     
    下面的例子,通过 wc -l 命令计算 document 的行数:
    $wc -l << EOF This is a simple lookup program for good (and bad) restaurants in Cape Town. EOF 3 $
    也可以 将 Here Document 用在脚本中,例如:
    1. #!/bin/bash
    2. cat << EOF
    3. This is a simple lookup program
    4. for good (and bad) restaurants
    5. in Cape Town.
    6. EOF
    运行结果:
    This is a simple lookup program for good (and bad) restaurants in Cape Town.
     
    下面的脚本通过 vi 编辑器将 document 保存到 test.txt 文件:
    1. #!/bin/sh
    2. filename=test.txt
    3. vi $filename <<EndOfCommands
    4. i
    5. This file was created automatically from
    6. a shell script
    7. ^[
    8. ZZ
    9. EndOfCommands
    运行脚本:
    $ sh test.sh Vim: Warning: Input is not from a terminal $
     
    打开 test.txt,可以看到下面的内容:
     
    $ cat test.txt This file was created automatically from a shell script $
     
    /dev/null 文件
    如果希望执行某个命令,但又不希望在屏幕上显示输出结果,那么可以将输出重定向到 /dev/null:
    1. $ command > /dev/null
    /dev/null 是一个特殊的文件,写入到它的内容都会被丢弃;如果尝试从该文件读取内容,那么什么也读不到。但是 /dev/null 文件非常有用,将命令的输出重定向到它,会起到”禁止输出“的效果。
     
    如果希望屏蔽 stdout 和 stderr,可以这样写:
    1. $ command > /dev/null 2>&1
     
    将标准错误输出到其他地方
     
    经常可以在一些脚本,尤其是在crontab调用时发现如下形式的命令调用:
    /tmp/test.sh > /tmp/test.log 2>&1
    前半部分/tmp/test.sh > /tmp/test.log很容易理解,那么后面的2>&1是怎么回事呢?
    要解释这个问题,还是得提到文件重定向。我们知道>和<是文件重定向符。那么1和2是什么?在shell中,每个进程都和三个系统文件相关联:标准输入stdin,标准输出stdout和标准错误stderr,三个系统文件的文件描述符分别为0,1和2。所以这里2>&1的意思就是将标准错误也输出到标准输出当中。
     
    实际上, > 就相当于 1> 也就是重定向标准输出,不包括标准错误。通过2>&1,就将标准错误重定向到标准输出了(stderr已作为stdout的副本),那么再使用>重定向就会将标准输出和标准错误信息一同重定向了。如果只想重定向标准错误到文件中,则可以使用2> file。

  • 相关阅读:
    apache安全—用户访问控制
    hdu 3232 Crossing Rivers 过河(数学期望)
    HDU 5418 Victor and World (可重复走的TSP问题,状压dp)
    UVA 11020 Efficient Solutions (BST,Splay树)
    UVA 11922 Permutation Transformer (Splay树)
    HYSBZ 1208 宠物收养所 (Splay树)
    HYSBZ 1503 郁闷的出纳员 (Splay树)
    HDU 5416 CRB and Tree (技巧)
    HDU 5414 CRB and String (字符串,模拟)
    HDU 5410 CRB and His Birthday (01背包,完全背包,混合)
  • 原文地址:https://www.cnblogs.com/python2687806834/p/10050099.html
Copyright © 2011-2022 走看看