bash的重定向



  • 1.2 Bash Manual, Redirection Section

    这是Bash手册中的重定向小节,可以使用man bash+/^REDIRECTION快速定位查看,大概在1700行左右的位置。

    REDIRECTION
           Before a command is executed, its input and output may be redirected using a special  notation
           interpreted by the shell.  Redirection allows commands' file handles to be duplicated, opened,
           closed, made to refer to different files, and can change the files the command reads from  and
           writes to.  Redirection may also be used to modify file handles in the current shell execution
           environment.  The following redirection operators may precede or appear anywhere within a sim‐
           ple  command  or  may  follow a command.  Redirections are processed in the order they appear,
           from left to right.
    
           Each redirection that may be preceded by a file descriptor number may instead be preceded by a
           word  of  the form {varname}.  In this case, for each redirection operator except >&- and <&-,
           the shell will allocate a file descriptor greater than or equal to 10 and assign  it  to  var‐
           name.   If >&- or <&- is preceded by {varname}, the value of varname defines the file descrip‐
           tor to close.  If {varname} is supplied, the redirection persists beyond the scope of the com‐
           mand, allowing the shell programmer to manage the file descriptor himself.
    
           In the following descriptions, if the file descriptor number is omitted, and the first charac‐
           ter of the redirection operator is <, the redirection refers to the standard input  (file  de‐
           scriptor  0).  If the first character of the redirection operator is >, the redirection refers
           to the standard output (file descriptor 1).
    
           The word following the redirection operator in the following  descriptions,  unless  otherwise
           noted,  is  subjected  to  brace expansion, tilde expansion, parameter and variable expansion,
           command substitution, arithmetic expansion, quote removal, pathname expansion, and word split‐
           ting.  If it expands to more than one word, bash reports an error.
    
           Note that the order of redirections is significant.  For example, the command
    
                  ls > dirlist 2>&1
    
           directs both standard output and standard error to the file dirlist, while the command
    
                  ls 2>&1 > dirlist
    
           directs  only  the  standard output to file dirlist, because the standard error was duplicated
           from the standard output before the standard output was redirected to dirlist.
    
           Bash handles several filenames specially when they are used in redirections, as  described  in
           the  following table.  If the operating system on which bash is running provides these special
           files, bash will use them; otherwise it will emulate them internally  with  the  behavior  de‐
           scribed below.
    
                  /dev/fd/fd
                         If fd is a valid integer, file descriptor fd is duplicated.
                  /dev/stdin
                         File descriptor 0 is duplicated.
                  /dev/stdout
                         File descriptor 1 is duplicated.
                  /dev/stderr
                         File descriptor 2 is duplicated.
                  /dev/tcp/host/port
                         If  host  is  a  valid hostname or Internet address, and port is an integer port
                         number or service name, bash attempts to open the corresponding TCP socket.
                  /dev/udp/host/port
                         If host is a valid hostname or Internet address, and port  is  an  integer  port
                         number or service name, bash attempts to open the corresponding UDP socket.
    
           A failure to open or create a file causes the redirection to fail.
    
           Redirections  using file descriptors greater than 9 should be used with care, as they may con‐
           flict with file descriptors the shell uses internally.
    
           Note that the exec builtin command can make redirections take effect in the current shell.
    
       Redirecting Input
           Redirection of input causes the file whose name results from  the  expansion  of  word  to  be
           opened for reading on file descriptor n, or the standard input (file descriptor 0) if n is not
           specified.
    
           The general format for redirecting input is:
    
                  [n]<word
    
       Redirecting Output
           Redirection of output causes the file whose name results from the  expansion  of  word  to  be
           opened  for  writing  on file descriptor n, or the standard output (file descriptor 1) if n is
           not specified.  If the file does not exist it is created; if it does exist it is truncated  to
           zero size.
    
           The general format for redirecting output is:
    
                  [n]>word
    
           If  the  redirection  operator  is >, and the noclobber option to the set builtin has been en‐
           abled, the redirection will fail if the file whose name results from the expansion of word ex‐
           ists and is a regular file.  If the redirection operator is >|, or the redirection operator is
           > and the noclobber option to the set builtin command is not enabled, the redirection  is  at‐
           tempted even if the file named by word exists.
    
       Appending Redirected Output
           Redirection of output in this fashion causes the file whose name results from the expansion of
           word to be opened for appending on file descriptor n, or the standard output (file  descriptor
           1) if n is not specified.  If the file does not exist it is created.
    
           The general format for appending output is:
    
                  [n]>>word
    
       Redirecting Standard Output and Standard Error
           This construct allows both the standard output (file descriptor 1) and the standard error out‐
           put (file descriptor 2) to be redirected to the file whose name is the expansion of word.
    
           There are two formats for redirecting standard output and standard error:
    
                  &>word
           and
                  >&word
    
           Of the two forms, the first is preferred.  This is semantically equivalent to
    
                  >word 2>&1
    
           When using the second form, word may not expand to a number or -.  If it does, other redirect‐
           ion operators apply (see Duplicating File Descriptors below) for compatibility reasons.
    
       Appending Standard Output and Standard Error
           This construct allows both the standard output (file descriptor 1) and the standard error out‐
           put (file descriptor 2) to be appended to the file whose name is the expansion of word.
    
           The format for appending standard output and standard error is:
    
                  &>>word
    
           This is semantically equivalent to
    
                  >>word 2>&1
    
           (see Duplicating File Descriptors below).
    
       Here Documents
           This type of redirection instructs the shell to read input from the  current  source  until  a
           line containing only delimiter (with no trailing blanks) is seen.  All of the lines read up to
           that point are then used as the standard input (or file descriptor n if n is specified) for  a
           command.
    
           The format of here-documents is:
    
                  [n]<<[-]word
                          here-document
                  delimiter
    
           No  parameter  and variable expansion, command substitution, arithmetic expansion, or pathname
           expansion is performed on word.  If any part of word is quoted, the delimiter is the result of
           quote  removal  on  word, and the lines in the here-document are not expanded.  If word is un‐
           quoted, all lines of the here-document are subjected to parameter expansion, command substitu‐
           tion,  and  arithmetic  expansion, the character sequence \<newline> is ignored, and \ must be
           used to quote the characters \, $, and `.
    
           If the redirection operator is <<-, then all leading tab characters are  stripped  from  input
           lines  and  the line containing delimiter.  This allows here-documents within shell scripts to
           be indented in a natural fashion.
    
       Here Strings
           A variant of here documents, the format is:
    
                  [n]<<<word
    
           The word undergoes tilde expansion, parameter and variable  expansion,  command  substitution,
           arithmetic  expansion,  and quote removal.  Pathname expansion and word splitting are not per‐
           formed.  The result is supplied as a single string, with a newline appended, to the command on
           its standard input (or file descriptor n if n is specified).
    
       Duplicating File Descriptors
           The redirection operator
    
                  [n]<&word
    
           is  used to duplicate input file descriptors.  If word expands to one or more digits, the file
           descriptor denoted by n is made to be a copy of that file descriptor.  If the digits  in  word
           do  not  specify a file descriptor open for input, a redirection error occurs.  If word evalu‐
           ates to -, file descriptor n is closed.  If n is not specified, the standard input  (file  de‐
           scriptor 0) is used.
    
           The operator
    
                  [n]>&word
    
           is  used  similarly to duplicate output file descriptors.  If n is not specified, the standard
           output (file descriptor 1) is used.  If the digits in word do not specify  a  file  descriptor
           open  for  output,  a  redirection error occurs.  If word evaluates to -, file descriptor n is
           closed.  As a special case, if n is omitted, and word does not expand to one or more digits or
           -, the standard output and standard error are redirected as described previously.
    
       Moving File Descriptors
           The redirection operator
    
                  [n]<&digit-
    
           moves  the  file descriptor digit to file descriptor n, or the standard input (file descriptor
           0) if n is not specified.  digit is closed after being duplicated to n.
    
           Similarly, the redirection operator
    
                  [n]>&digit-
    
           moves the file descriptor digit to file descriptor n, or the standard output (file  descriptor
           1) if n is not specified.
    
       Opening File Descriptors for Reading and Writing
           The redirection operator
    
                  [n]<>word
    
           causes  the file whose name is the expansion of word to be opened for both reading and writing
           on file descriptor n, or on file descriptor 0 if n is not specified.  If the file does not ex‐
           ist, it is created.
    


  • 2 重定向命令

    2.1 读写重定向

    读重定向没有指定文件描述符时,默认为0(stdin);写重定向没有指定文件描述符时,默认为1(stdout)。

    • 格式:[n]<word
    • 效果:word被Bash展开的结果作为文件名,以读的方式打开,然后将文件描述符n指向那个文件

    • 格式:[n]>word
    • 效果:以写的方式打开word文件,文件描述符n指向该文件。该文件不存在则会被创建,文件已存在则会被清空。
    • 注意:
      • 文件已存在时,如果Bash启用了noclobber选项(set -o noclobber),则重定向操作会失败(文件不会被清空)
      • 如果运算符是>|([n]>|word),则始终覆盖文件

    1. 追加写
    • 格式:[n]>>word
    • 效果:以写的方式打开word文件,文件描述符n指向该文件。该文件不存在则会被创建;文件已存在,则写入内容时向文件末尾追加。


  • 2.2 duplicate文件描述符(work in progress)

    1. dup写
    • 格式:[n]<&word
    1. dup读
    • 格式:[n]>&word


  • 2.3 写重定向实例:stdoutstderr(work in progress)

    1. 重定向写入
    • 格式:&>word, >&word, >word 2>&1
    1. 追加重定向写入
    • 格式:&>>word, >>word 2>&1


  • 2.4 文件描述符 打开,移动,关闭(work in progress)

    1. 打开
    • 格式:[n]<>word
    1. 移动
    • 格式:[n]<&digit-, [n]>&digit-
    1. 关闭
    • 格式:[n]<&-, [n]>&-


  • 2.5 Here Documents/Strings (work in progress)

    1. Here Documents
    • 格式:
         [n]<<[-]word
                 here-document
         delimiter
    
    • 效果
    • 注意:
      • 如果重定向运算符是<<-,行首的<tab>delimiter那一行会被去掉(行首空格不会被去掉!)。这是为了使shell脚本的格式更自然
    1. Here Strings
    • 格式:[n]<<<word


  • 3 杂项

    1. 每个重定向运算符前,指定文件描述符的n都可以换成{varname},这时一个大于等于10的文件描述符会被赋值给变量varname。例如exec {my_fd}<filename
      • 注意命令写成脚本之后,用zsh执行会报错exec: {varname}: not found,待排查


  • 此回复已被删除!


  • 是会常用又常忘的东西,mark了!



  • mark了


登录后回复
 

Copyright © 2018 bbs.dian.org.cn All rights reserved.

与 Dian 的连接断开,我们正在尝试重连,请耐心等待