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.

  • 相关阅读:
    Yii1.1应用升级到Yii2.0的一些注意点
    js经常使用功能代码
    P3370 【模板】字符串哈希
    poj 2406 Power Strings 周期问题
    P1325 雷达安装
    P1809 过河问题_NOI导刊2011提高(01)
    P1791 线段覆盖
    田忌赛马
    1225 八数码难题
    P1115 最大子段和
  • 原文地址:https://www.cnblogs.com/rsapaper/p/7750279.html
Copyright © 2011-2022 走看看