zoukankan      html  css  js  c++  java
  • file descriptor 0 1 2 一切皆文件 stdout stderr stdin /dev/null 沉默是金 pipes 禁止输出 屏蔽 stdout 和 stderr 输入输出重定向 重定向文件描述符

    movie.mpeg.001 movie.mpeg.002 movie.mpeg.003 ... movie.mpeg.099
     
    $cat movie.mpeg.0*>movie.mpeg
     
     

    Examples:
    cat f - g Output f's contents, then standard input, then g's contents.
    cat Copy standard input to standard output.

    Shell 输入/输出重定向

    https://ipcmen.com/shell-input-output-redirection

    大多数 UNIX 系统命令从你的终端接受输入并将所产生的输出发送回​​到您的终端。一个命令通常从一个叫标准输入的地方读取输入,默认情况下,这恰好是你的终端。同样,一个命令通常将其输出写入到标准输出,默认情况下,这也是你的终端。

    重定向命令列表如下:

    命令说明
    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 之间的内容作为输入。

    需要注意的是文件描述符 0 通常是标准输入(STDIN),1 是标准输出(STDOUT),2 是标准错误输出(STDERR)。

     
     
     
     
     
    [xiaole@localhost ~]$ wc -l << EOF
    > 欢迎
    > you
    > 太阳
    > EOF
    3
    [xiaole@localhost ~]$
    

      

    输出重定向

    重定向一般通过在命令间插入特定的符号来实现。特别的,这些符号的语法如下所示:

    command1 > file1

    上面这个命令执行command1然后将输出的内容存入file1。

    注意任何file1内的已经存在的内容将被新内容替代。如果要将新内容添加在文件末尾,请使用>>操作符。

    实例

    执行下面的 who 命令,它将命令的完整的输出重定向在用户文件中(users):

    $ who > users

    执行后,并没有在终端输出信息,这是因为输出已被从默认的标准输出设备(终端)重定向到指定的文件。

    你可以使用 cat 命令查看文件内容:

    $ cat users
    _mbsetupuser console  Oct 31 17:35 
    tianqixin    console  Oct 31 17:35 
    tianqixin    ttys000  Dec  1 11:33

    输出重定向会覆盖文件内容,请看下面的例子:

    $ echo "IPCMEN:www.ipcmen.com" > users
    $ cat users
    IPCMEN:www.ipcmen.com
    $

    如果不希望文件内容被覆盖,可以使用 >> 追加到文件末尾,例如:

    $ echo "IPCMEN:www.ipcmen.com" >> users
    $ cat users
    IPCMEN:www.ipcmen.com
    IPCMEN:www.ipcmen.com
    $

    输入重定向

    和输出重定向一样,Unix 命令也可以从文件获取输入,语法为:

    command1 < file1

    这样,本来需要从键盘获取输入的命令会转移到文件读取内容。

    注意:输出重定向是大于号(>),输入重定向是小于号(<)。

    实例

    接着以上实例,我们需要统计 users 文件的行数,执行以下命令:

    $ wc -l users
           2 users

    也可以将输入重定向到 users 文件:

    $  wc -l < users
           2

    注意:上面两个例子的结果不同:第一个例子,会输出文件名;第二个不会,因为它仅仅知道从标准输入读取内容。

    command1 < infile > outfile

    同时替换输入和输出,执行command1,从文件infile读取内容,然后将输出写入到outfile中。

    重定向深入讲解

    一般情况下,每个 Unix/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,可以这样写:

    $ command 2 > file

    如果希望 stderr 追加到 file 文件末尾,可以这样写:

    $ command 2 >> file

    2 表示标准错误文件(stderr)。

    如果希望将 stdout 和 stderr 合并后重定向到 file,可以这样写:

    $ command > file 2>&1
    
    或者
    
    $ command >> file 2>&1

    如果希望对 stdin 和 stdout 都重定向,可以这样写:

    $ command < file1 >file2

    command 命令将 stdin 重定向到 file1,将 stdout 重定向到 file2。


    Here Document

    Here Document 是 Shell 中的一种特殊的重定向方式,用来将输入重定向到一个交互式 Shell 脚本或程序。

    它的基本的形式如下:

    command << delimiter
        document
    delimiter

    它的作用是将两个 delimiter 之间的内容(document) 作为输入传递给 command。

    注意:

    • 结尾的delimiter 一定要顶格写,前面不能有任何字符,后面也不能有任何字符,包括空格和 tab 缩进。
    • 开始的delimiter前后的空格会被忽略掉。

    实例

    在命令行中通过 wc -l 命令计算 Here Document 的行数:

    $ wc -l << EOF
        欢迎来到
        IPCMEN
        www.ipcmen.com
    EOF
    3          # 输出结果为 3 行
    $

    我们也可以将 Here Document 用在脚本中,例如:

    #!/bin/bash
    # author:IPCMEN
    # url:www.ipcmen.com
    
    cat << EOF
    欢迎来到
    IPCMEN
    www.ipcmen.com
    EOF

    执行以上脚本,输出结果:

    欢迎来到
    IPCMEN
    www.ipcmen.com

    /dev/null 文件

    如果希望执行某个命令,但又不希望在屏幕上显示输出结果,那么可以将输出重定向到 /dev/null:

    $ command > /dev/null

    /dev/null 是一个特殊的文件,写入到它的内容都会被丢弃;如果尝试从该文件读取内容,那么什么也读不到。但是 /dev/null 文件非常有用,将命令的输出重定向到它,会起到”禁止输出”的效果。

    如果希望屏蔽 stdout 和 stderr,可以这样写:

    $ command > /dev/null 2>&1

    注意:0 是标准输入(STDIN),1 是标准输出(STDOUT),2 是标准错误输出(STDERR)。

     https://www.tldp.org/LDP/abs/html/io-redirection.html

    I/O Redirection 

    Chapter 20. I/O Redirection

    Table of Contents
    20.1. Using exec
    20.2. Redirecting Code Blocks
    20.3. Applications

    There are always three default files [1] open, stdin (the keyboard), stdout (the screen), and stderr (error messages output to the screen). These, and any other open files, can be redirected. Redirection simply means capturing output from a file, command, program, script, or even code block within a script (see Example 3-1 and Example 3-2) and sending it as input to another file, command, program, or script.

    Each open file gets assigned a file descriptor. [2] The file descriptors for stdinstdout, and stderr are 0, 1, and 2, respectively. For opening additional files, there remain descriptors 3 to 9. It is sometimes useful to assign one of these additional file descriptors to stdin,stdout, or stderr as a temporary duplicate link. [3] This simplifies restoration to normal after complex redirection and reshuffling (see Example 20-1).

       COMMAND_OUTPUT >
          # Redirect stdout to a file.
          # Creates the file if not present, otherwise overwrites it.
    
          ls -lR > dir-tree.list
          # Creates a file containing a listing of the directory tree.
    
       : > filename
          # The > truncates file "filename" to zero length.
          # If file not present, creates zero-length file (same effect as 'touch').
          # The : serves as a dummy placeholder, producing no output.
    
       > filename    
          # The > truncates file "filename" to zero length.
          # If file not present, creates zero-length file (same effect as 'touch').
          # (Same result as ": >", above, but this does not work with some shells.)
    
       COMMAND_OUTPUT >>
          # Redirect stdout to a file.
          # Creates the file if not present, otherwise appends to it.
    
    
          # Single-line redirection commands (affect only the line they are on):
          # --------------------------------------------------------------------
    
       1>filename
          # Redirect stdout to file "filename."
       1>>filename
          # Redirect and append stdout to file "filename."
       2>filename
          # Redirect stderr to file "filename."
       2>>filename
          # Redirect and append stderr to file "filename."
       &>filename
          # Redirect both stdout and stderr to file "filename."
          # This operator is now functional, as of Bash 4, final release.
    
       M>N
         # "M" is a file descriptor, which defaults to 1, if not explicitly set.
         # "N" is a filename.
         # File descriptor "M" is redirect to file "N."
       M>&N
         # "M" is a file descriptor, which defaults to 1, if not set.
         # "N" is another file descriptor.
    
          #==============================================================================
    
          # Redirecting stdout, one line at a time.
          LOGFILE=script.log
    
          echo "This statement is sent to the log file, "$LOGFILE"." 1>$LOGFILE
          echo "This statement is appended to "$LOGFILE"." 1>>$LOGFILE
          echo "This statement is also appended to "$LOGFILE"." 1>>$LOGFILE
          echo "This statement is echoed to stdout, and will not appear in "$LOGFILE"."
          # These redirection commands automatically "reset" after each line.
    
    
    
          # Redirecting stderr, one line at a time.
          ERRORFILE=script.errors
    
          bad_command1 2>$ERRORFILE       #  Error message sent to $ERRORFILE.
          bad_command2 2>>$ERRORFILE      #  Error message appended to $ERRORFILE.
          bad_command3                    #  Error message echoed to stderr,
                                          #+ and does not appear in $ERRORFILE.
          # These redirection commands also automatically "reset" after each line.
          #=======================================================================

       2>&1
          # Redirects stderr to stdout.
          # Error messages get sent to same place as standard output.
            >>filename 2>&1
                bad_command >>filename 2>&1
                # Appends both stdout and stderr to the file "filename" ...
            2>&1 | [command(s)]
                bad_command 2>&1 | awk '{print $5}'   # found
                # Sends stderr through a pipe.
                # |& was added to Bash 4 as an abbreviation for 2>&1 |.
    
       i>&j
          # Redirects file descriptor i to j.
          # All output of file pointed to by i gets sent to file pointed to by j.
    
       >&j
          # Redirects, by default, file descriptor 1 (stdout) to j.
          # All stdout gets sent to file pointed to by j.

       0< FILENAME
        < FILENAME
          # Accept input from a file.
          # Companion command to ">", and often used in combination with it.
          #
          # grep search-word <filename
    
    
       [j]<>filename
          #  Open file "filename" for reading and writing,
          #+ and assign file descriptor "j" to it.
          #  If "filename" does not exist, create it.
          #  If file descriptor "j" is not specified, default to fd 0, stdin.
          #
          #  An application of this is writing at a specified place in a file. 
          echo 1234567890 > File    # Write string to "File".
          exec 3<> File             # Open "File" and assign fd 3 to it.
          read -n 4 <&3             # Read only 4 characters.
          echo -n . >&3             # Write a decimal point there.
          exec 3>&-                 # Close fd 3.
          cat File                  # ==> 1234.67890
          #  Random access, by golly.
    
    
    
       |
          # Pipe.
          # General purpose process and command chaining tool.
          # Similar to ">", but more general in effect.
          # Useful for chaining commands, scripts, files, and programs together.
          cat *.txt | sort | uniq > result-file
          # Sorts the output of all the .txt files and deletes duplicate lines,
          # finally saves results to "result-file".

    Multiple instances of input and output redirection and/or pipes can be combined in a single command line.

    command < input-file > output-file
    # Or the equivalent:
    < input-file command > output-file   # Although this is non-standard.
    
    command1 | command2 | command3 > output-file

    See Example 16-31 and Example A-14.

    Multiple output streams may be redirected to one file.

    ls -yz >> command.log 2>&1
    #  Capture result of illegal options "yz" in file "command.log."
    #  Because stderr is redirected to the file,
    #+ any error messages will also be there.
    
    #  Note, however, that the following does *not* give the same result.
    ls -yz 2>&1 >> command.log
    #  Outputs an error message, but does not write to file.
    #  More precisely, the command output (in this case, null)
    #+ writes to the file, but the error message goes only to stdout.
    
    #  If redirecting both stdout and stderr,
    #+ the order of the commands makes a difference.

    Closing File Descriptors

    n<&-

    Close input file descriptor n.

    0<&-, <&-

    Close stdin.

    n>&-

    Close output file descriptor n.

    1>&-, >&-

    Close stdout.

    Child processes inherit open file descriptors. This is why pipes work. To prevent an fd from being inherited, close it.

    # Redirecting only stderr to a pipe.
    
    exec 3>&1                              # Save current "value" of stdout.
    ls -l 2>&1 >&3 3>&- | grep bad 3>&-    # Close fd 3 for 'grep' (but not 'ls').
    #              ^^^^   ^^^^
    exec 3>&-                              # Now close it for the remainder of the script.
    
    # Thanks, S.C.

    For a more detailed introduction to I/O redirection see Appendix F.

    Notes

    [1]

    By convention in UNIX and Linux, data streams and peripherals (device files) are treated as files, in a fashion analogous to ordinary files.

    [2]

    file descriptor is simply a number that the operating system assigns to an open file to keep track of it. Consider it a simplified type of file pointer. It is analogous to a file handle in C.

    [3]

    Using file descriptor 5 might cause problems. When Bash creates a child process, as with exec, the child inherits fd 5 (see Chet Ramey's archived e-mail, SUBJECT: RE: File descriptor 5 is held open). Best leave this particular fd alone.

  • 相关阅读:
    CodeForces 219D Choosing Capital for Treeland (树形DP)
    POJ 3162 Walking Race (树的直径,单调队列)
    POJ 2152 Fire (树形DP,经典)
    POJ 1741 Tree (树的分治,树的重心)
    POJ 1655 Balancing Act (树的重心,常规)
    HDU 2196 Computer (树形DP)
    HDU 1520 Anniversary party (树形DP,入门)
    寒门子弟
    JQuery选择器(转)
    (四)Web应用开发---系统架构图
  • 原文地址:https://www.cnblogs.com/rsapaper/p/7750279.html
Copyright © 2011-2022 走看看