mirror of
				git://git.code.sf.net/p/zsh/code
				synced 2025-10-31 06:00:54 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			331 lines
		
	
	
	
		
			12 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			331 lines
		
	
	
	
		
			12 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
| texinode(Redirection)(Command Execution)(Shell Grammar)(Top)
 | |
| chapter(Redirection)
 | |
| cindex(redirection)
 | |
| ifzman(\
 | |
| sect(Redirection)
 | |
| )\
 | |
| cindex(file descriptors)
 | |
| cindex(descriptors, file)
 | |
| If a command is followed by tt(&)
 | |
| and job control is not active,
 | |
| then the default standard input
 | |
| for the command is the empty file tt(/dev/null).
 | |
| Otherwise, the environment for the execution of a command contains the
 | |
| file descriptors of the invoking shell as modified by
 | |
| input/output specifications.
 | |
| 
 | |
| The following may appear anywhere in a simple command
 | |
| or may precede or follow a complex command.
 | |
| Expansion occurs before var(word) or var(digit)
 | |
| is used except as noted below.
 | |
| If the result of substitution on var(word)
 | |
| produces more than one filename,
 | |
| redirection occurs for each
 | |
| separate filename in turn.
 | |
| 
 | |
| startitem()
 | |
| item(tt(<) var(word))(
 | |
| Open file var(word) for reading as standard input.
 | |
| )
 | |
| item(tt(<>) var(word))(
 | |
| Open file var(word) for reading and writing as standard input.
 | |
| If the file does not exist then it is created.
 | |
| )
 | |
| item(tt(>) var(word))(
 | |
| Open file var(word) for writing as standard output.
 | |
| If the file does not exist then it is created.
 | |
| If the file exists, and the tt(CLOBBER) option is unset,
 | |
| this causes an error;
 | |
| otherwise, it is truncated to zero length.
 | |
| )
 | |
| xitem(tt(>|) var(word))
 | |
| item(tt(>!) var(word))(
 | |
| Same as tt(>), except that the file is truncated to zero length
 | |
| if it exists, even if tt(CLOBBER) is unset.
 | |
| )
 | |
| item(tt(>>) var(word))(
 | |
| Open file var(word) for writing in append mode as standard output.
 | |
| If the file does not exist, and the tt(CLOBBER)
 | |
| option is unset, this causes an error;
 | |
| otherwise, the file is created.
 | |
| )
 | |
| xitem(tt(>>|) var(word))
 | |
| item(tt(>>!) var(word))(
 | |
| Same as tt(>>), except that the file is created if it does not
 | |
| exist, even if tt(CLOBBER) is unset.
 | |
| )
 | |
| item(tt(<<)[tt(-)] var(word))(
 | |
| The shell input is read up to a line that is the same as
 | |
| var(word), or to an end-of-file.
 | |
| No parameter expansion, command substitution or
 | |
| filename generation is performed on var(word).
 | |
| The resulting document, called a
 | |
| em(here-document), becomes the standard input.
 | |
| 
 | |
| If any character of var(word) is quoted with
 | |
| single or double quotes or a `tt(\)',
 | |
| no interpretation is placed upon the characters of the document.
 | |
| Otherwise, parameter and command substitution
 | |
| occurs, `tt(\)' followed by a newline is removed,
 | |
| and `tt(\)' must be used to quote the characters
 | |
| `tt(\)', `tt($)', `tt(`)' and the first character of var(word).
 | |
| 
 | |
| Note that var(word) itself does not undergo shell expansion.  Backquotes
 | |
| in var(word) do not have their usual effect; instead they behave
 | |
| similarly to double quotes, except that the backquotes themselves are
 | |
| passed through unchanged.  (This information is given for completeness
 | |
| and it is not recommended that backquotes be used.)  Quotes in the form
 | |
| tt($')var(...)tt(') have their standard effect of expanding backslashed
 | |
| references to special characters.
 | |
| 
 | |
| If tt(<<-) is used, then all leading
 | |
| tabs are stripped from var(word) and from the document.
 | |
| )
 | |
| item(tt(<<<) var(word))(
 | |
| Perform shell expansion on var(word) and pass the result
 | |
| to standard input.  This is known as a em(here-string).
 | |
| Compare the use of var(word) in here-documents above, where var(word)
 | |
| does not undergo shell expansion.
 | |
| )
 | |
| xitem(tt(<&) var(number))
 | |
| item(tt(>&) var(number))(
 | |
| The standard input/output is duplicated from file descriptor
 | |
| var(number) (see manref(dup2)(2)).
 | |
| )
 | |
| xitem(tt(<& -))
 | |
| item(tt(>& -))(
 | |
| Close the standard input/output.
 | |
| )
 | |
| xitem(tt(<& p))
 | |
| item(tt(>& p))(
 | |
| The input/output from/to the coprocess is moved to the standard input/output.
 | |
| )
 | |
| xitem(tt(>&) var(word))
 | |
| item(tt(&>) var(word))(
 | |
| (Except where `tt(>&) var(word)' matches one of the above syntaxes;
 | |
| `tt(&>)' can always be used to avoid this ambiguity.)
 | |
| Redirects both standard output and standard error (file descriptor 2)
 | |
| in the manner of `tt(>) var(word)'.
 | |
| Note that this does em(not) have the same effect as `tt(>) var(word) tt(2>&1)'
 | |
| in the presence of multios (see the section below).
 | |
| )
 | |
| xitem(tt(>&|) var(word))
 | |
| xitem(tt(>&!) var(word))
 | |
| xitem(tt(&>|) var(word))
 | |
| item(tt(&>!) var(word))(
 | |
| Redirects both standard output and standard error (file descriptor 2)
 | |
| in the manner of `tt(>|) var(word)'.
 | |
| )
 | |
| xitem(tt(>>&) var(word))
 | |
| item(tt(&>>) var(word))(
 | |
| Redirects both standard output and standard error (file descriptor 2)
 | |
| in the manner of `tt(>>) var(word)'.
 | |
| )
 | |
| xitem(tt(>>&|) var(word))
 | |
| xitem(tt(>>&!) var(word))
 | |
| xitem(tt(&>>|) var(word))
 | |
| item(tt(&>>!) var(word))(
 | |
| Redirects both standard output and standard error (file descriptor 2)
 | |
| in the manner of `tt(>>|) var(word)'.
 | |
| )
 | |
| enditem()
 | |
| 
 | |
| If one of the above is preceded by a digit, then the file
 | |
| descriptor referred to is that specified by the digit
 | |
| instead of the default 0 or 1.
 | |
| The order in which redirections are specified is significant.
 | |
| The shell evaluates each redirection in terms of the
 | |
| (em(file descriptor), em(file))
 | |
| association at the time of evaluation.
 | |
| For example:
 | |
| 
 | |
| indent(... tt(1>)var(fname) tt(2>&1))
 | |
| 
 | |
| first associates file descriptor 1 with file var(fname).
 | |
| It then associates file descriptor 2 with the file associated with file
 | |
| descriptor 1 (that is, var(fname)).
 | |
| If the order of redirections were reversed,
 | |
| file descriptor 2 would be associated
 | |
| with the terminal (assuming file descriptor 1 had been)
 | |
| and then file descriptor 1 would be associated with file var(fname).
 | |
| 
 | |
| The `tt(|&)' command separator described in
 | |
| ifzman(em(Simple Commands & Pipelines) in zmanref(zshmisc))\
 | |
| ifnzman(noderef(Simple Commands & Pipelines))
 | |
| is a shorthand for `tt(2>&1 |)'.
 | |
| 
 | |
| The various forms of process substitution, `tt(<LPAR())var(list)tt(RPAR())',
 | |
| and `tt(=LPAR())var(list)(RPAR())' for input and
 | |
| `tt(>LPAR())var(list)tt(RPAR())' for output, are often used together with
 | |
| redirection.  For example, if var(word) in an output redirection is of the
 | |
| form `tt(>LPAR())var(list)tt(RPAR())' then the output is piped to the
 | |
| command represented by var(list).  See
 | |
| ifzman(\
 | |
| em(Process Substitution) in zmanref(zshexpn))\
 | |
| ifnzman(\
 | |
| noderef(Process Substitution)).
 | |
| sect(Opening file descriptors using parameters)
 | |
| cindex(file descriptors, use with parameters)
 | |
| cindex(parameters, for using file descriptors)
 | |
| 
 | |
| When the shell is parsing arguments to a command, and the shell option
 | |
| tt(IGNORE_BRACES) is not set, a different form of redirection is allowed:
 | |
| instead of a digit before the operator there is a valid shell identifier
 | |
| enclosed in braces.  The shell will open a new file descriptor that
 | |
| is guaranteed to be at least 10 and set the parameter named by the
 | |
| identifier to the file descriptor opened.  No whitespace is allowed
 | |
| between the closing brace and the redirection character.  For example:
 | |
| 
 | |
| indent(... {myfd}>&1)
 | |
| 
 | |
| This opens a new file descriptor that is a duplicate of file descriptor
 | |
| 1 and sets the parameter tt(myfd) to the number of the file descriptor,
 | |
| which will be at least 10.  The new file descriptor can be written to using
 | |
| the syntax tt(>&$myfd).
 | |
| 
 | |
| The syntax tt({)var(varid)tt(}>&-), for example tt({myfd}>&-), may be used
 | |
| to close a file descriptor opened in this fashion.  Note that the
 | |
| parameter given by var(varid) must previously be set to a file descriptor
 | |
| in this case.
 | |
| 
 | |
| It is an error to open or close a file descriptor in this fashion when the
 | |
| parameter is readonly.  However, it is not an error to read or write a file
 | |
| descriptor using tt(<&$)var(param) or tt(>&$)var(param) if var(param) is
 | |
| readonly.
 | |
| 
 | |
| If the option tt(CLOBBER) is unset, it is an error to open a file
 | |
| descriptor using a parameter that is already set to an open file descriptor
 | |
| previously allocated by this mechanism.  Unsetting the parameter before
 | |
| using it for allocating a file descriptor avoids the error.
 | |
| 
 | |
| Note that this mechanism merely allocates or closes a file descriptor; it
 | |
| does not perform any redirections from or to it.  It is usually convenient
 | |
| to allocate a file descriptor prior to use as an argument to tt(exec).
 | |
| The syntax does not in any case work when used around complex commands
 | |
| such as parenthesised subshells or loops, where the opening brace is
 | |
| interpreted as part of a command list to be executed in the current shell.
 | |
| 
 | |
| The following shows a typical sequence of allocation, use, and closing of a
 | |
| file descriptor:
 | |
| 
 | |
| example(integer myfd
 | |
| exec {myfd}>~/logs/mylogfile.txt
 | |
| print This is a log message. >&$myfd
 | |
| exec {myfd}>&-)
 | |
| 
 | |
| Note that the expansion of the variable in the expression tt(>&$myfd)
 | |
| occurs at the point the redirection is opened.  This is after the expansion
 | |
| of command arguments and after any redirections to the left on the command
 | |
| line have been processed.
 | |
| sect(Multios)
 | |
| cindex(multios)
 | |
| pindex(MULTIOS, use of)
 | |
| If the user tries to open a file descriptor for writing more than once,
 | |
| the shell opens the file descriptor as a pipe to a process that copies
 | |
| its input to all the specified outputs, similar to bf(tee),
 | |
| provided the tt(MULTIOS) option is set, as it is by default.  Thus:
 | |
| 
 | |
| example(date >foo >bar)
 | |
| 
 | |
| writes the date to two files, named `tt(foo)' and `tt(bar)'.
 | |
| Note that a pipe is an implicit redirection; thus
 | |
| 
 | |
| example(date >foo | cat)
 | |
| 
 | |
| writes the date to the file `tt(foo)', and also pipes it to cat.
 | |
| 
 | |
| If the tt(MULTIOS)
 | |
| option is set, the word after a redirection operator is also subjected
 | |
| to filename generation (globbing).  Thus
 | |
| 
 | |
| example(: > *)
 | |
| 
 | |
| will truncate all files in the current directory,
 | |
| assuming there's at least one.  (Without the tt(MULTIOS)
 | |
| option, it would create an empty file called `tt(*)'.)
 | |
| Similarly, you can do
 | |
| 
 | |
| example(echo exit 0 >> *.sh)
 | |
| 
 | |
| If the user tries to open a file descriptor for reading more than once,
 | |
| the shell opens the file descriptor as a pipe to a process that copies
 | |
| all the specified inputs to its output in the order
 | |
| specified, similar to bf(cat),
 | |
| provided the tt(MULTIOS) option is set.  Thus
 | |
| 
 | |
| example(sort <foo <fubar)
 | |
| 
 | |
| or even
 | |
| 
 | |
| example(sort <f{oo,ubar})
 | |
| 
 | |
| is equivalent to `tt(cat foo fubar | sort)'.
 | |
| 
 | |
| Expansion of the redirection argument occurs at the point the redirection
 | |
| is opened, at the point described above for the expansion of the variable
 | |
| in tt(>&$myfd).
 | |
| 
 | |
| Note that a pipe is an implicit redirection; thus
 | |
| 
 | |
| example(cat bar | sort <foo)
 | |
| 
 | |
| is equivalent to `tt(cat bar foo | sort)' (note the order of the inputs).
 | |
| 
 | |
| If the tt(MULTIOS) option is em(un)set,
 | |
| each redirection replaces the previous redirection for that file descriptor.
 | |
| However, all files redirected to are actually opened, so
 | |
| 
 | |
| example(echo foo > bar > baz)
 | |
| 
 | |
| when tt(MULTIOS) is unset will truncate bar, and write `tt(foo)' into baz.
 | |
| 
 | |
| There is a problem when an output multio is attached to an external
 | |
| program.  A simple example shows this:
 | |
| 
 | |
| example(cat file >file1 >file2
 | |
| cat file1 file2)
 | |
| 
 | |
| Here, it is possible that the second `tt(cat)' will not display the full
 | |
| contents of tt(file1) and tt(file2) (i.e. the original contents of
 | |
| tt(file) repeated twice).
 | |
| 
 | |
| The reason for this is that the multios are spawned after the tt(cat)
 | |
| process is forked from the parent shell, so the parent shell does not
 | |
| wait for the multios to finish writing data.  This means the command as
 | |
| shown can exit before tt(file1) and tt(file2) are completely written.
 | |
| As a workaround, it is possible to run the tt(cat) process as part of a
 | |
| job in the current shell:
 | |
| 
 | |
| example({ cat file } >file >file2)
 | |
| 
 | |
| Here, the tt({)var(...)tt(}) job will pause to wait for both files to be
 | |
| written.
 | |
| 
 | |
| sect(Redirections with no command)
 | |
| When a simple command consists of one or more redirection operators
 | |
| and zero or more parameter assignments, but no command name, zsh can
 | |
| behave in several ways.
 | |
| 
 | |
| vindex(NULLCMD, use of)
 | |
| pindex(CSH_NULLCMD, use of)
 | |
| If the parameter tt(NULLCMD) is not set or the option tt(CSH_NULLCMD) is
 | |
| set, an error is caused.  This is the bf(csh) behavior and tt(CSH_NULLCMD)
 | |
| is set by default when emulating bf(csh).
 | |
| 
 | |
| pindex(SH_NULLCMD, use of)
 | |
| If the option tt(SH_NULLCMD) is set, the builtin `tt(:)' is inserted as a
 | |
| command with the given redirections.  This is the default when emulating
 | |
| bf(sh) or bf(ksh).
 | |
| 
 | |
| vindex(READNULLCMD, use of)
 | |
| Otherwise, if the parameter tt(NULLCMD) is set, its value will be used as a
 | |
| command with the given redirections.  If both tt(NULLCMD) and
 | |
| tt(READNULLCMD) are set, then the value of the latter will be used instead
 | |
| of that of the former when the redirection is an input.  The default for
 | |
| tt(NULLCMD) is `tt(cat)' and for tt(READNULLCMD) is `tt(more)'. Thus
 | |
| 
 | |
| example(< file)
 | |
| 
 | |
| shows the contents of tt(file) on standard output, with paging if that is a
 | |
| terminal.  tt(NULLCMD) and tt(READNULLCMD) may refer to shell functions.
 | |
| 
 |