[Share Experiences] Brief Explanation of Output Redirection
Experiences and Insight 721 views · 0 replies ·
SuperDavid
deepin
2024-09-19 10:45
Author
[Tutorials] Brief Explanation of Output Redirection
File Descriptors
All I/O operations of Linux processes involve reading or writing to a file descriptor. A file descriptor is a non-negative integer associated with a file that a process is using.
Since everything in Linux is a file, a file descriptor could point to a regular file, a device like a keyboard or monitor, a pipe, a network link, and so on.
When a process starts, it has three default file descriptors, as follows:
File Descriptor
Chinese Name
English Name
Default Link
0
标准输入
stdin
Terminal input device (keyboard)
1
标准输出
stdout
Terminal display device (screen)
2
标准错误输出
stderr
Terminal display device (screen)
Redirection
A process (or command) receives input through its "standard input" and sends correct results to "standard output" and error messages to "standard error output."
Input/output redirection changes the default links of standard input (0), standard output (1), and standard error output (2) to other files.
Common Redirection Usages:
Usage
Description
command > file1
Redirect standard output, overwriting file1. Equivalent to command 1> file1.
command >> file1
Redirect standard output, appending to file1. Equivalent to command 1>> file1.
command 2> file1
Redirect standard error output, overwriting file1.
command 2>> file1
Redirect standard error output, appending to file1.
command 2> /dev/null
Redirect standard error output to /dev/null(discard).
command 1> file1 2>&1
Redirect standard output to file1, and redirect standard error output to the same location.
command 1>> file1 2>&1
Append standard output to file1, and redirect standard error output to the same location.
command &> file1
Use the combined redirection operator to redirect both standard output and standard error output.
command < file1
Redirect standard input from file1. Equivalent to command 0< file1.
The advantage of the combined redirection operator is that it simplifies the syntax, though there may be compatibility issues in some situations.
Pipes
The pipe symbol (|) connects the standard output of one command to the standard input of the next command. Data flows through the pipe from one process to another, and each process modifies the data as it flows through.
For example:
ls -il | wc | less
Using Redirection and Pipes Together
Redirection sends standard output to a file or retrieves standard input from a file. A pipe connects the standard output of one process to the standard input of another.
When using both redirection and pipes together:
cat /etc/passwd >passwd.out | wc: If the redirection to a file occurs before the pipe symbol, the command after the pipe will receive an empty input since the standard output has already been redirected to a file.
cat /etc/passwd | wc >passwd.out: If the pipe is placed before the redirection, the standard output being redirected is the output of the command after the pipe, not the command before it.
If you want to save the standard output to a file and also use it as input for the next command, you can use the tee command.
The tee command reads from standard input and writes to both standard output and a file.
Examples:
ls /etc | tee etc.list | less
This will overwrite the output of ls /etc into the file etc.list and open it with less.
ls /etc | tee -a etc.list
This appends the output of ls /etc to etc.list while displaying it on the screen.
To redirect both standard output and standard error into a pipe, simply redirect standard error to the same location as standard output: command 2>&1 | command. (Note: The combined redirection operator cannot be used in this case.)
Examples
Standard Output (1) Redirection:
user1@user1-PC:~$ date
Thu Dec 14 12:19:06 CST 2023 # Standard output of the date command
user1@user1-PC:~$ date >date.txt; wc date.txt; cat date.txt
1 6 43 date.txt # Output redirected to date.txt, wc reads the file content
Thu Dec 14 12:19:21 CST 2023 # cat reads date.txt
user1@user1-PC:~$ date 1>>date.txt; wc date.txt; cat date.txt
2 12 86 date.txt # Output appended to the file, now contains two lines
Thu Dec 14 12:19:21 CST 2023 # First line of the file
Thu Dec 14 12:19:34 CST 2023 # Second line of the file
user1@user1-PC:~$ date 2>>date.txt; wc date.txt; cat date.txt
Thu Dec 14 12:19:58 CST 2023 # Error output redirected to the file, correct output to the screen
2 12 86 date.txt # No error message, file content still two lines
Thu Dec 14 12:19:21 CST 2023 # First line of the file
Thu Dec 14 12:19:34 CST 2023 # Second line of the file
[Tutorials] Brief Explanation of Output Redirection
File Descriptors
All I/O operations of Linux processes involve reading or writing to a file descriptor. A file descriptor is a non-negative integer associated with a file that a process is using.
Since everything in Linux is a file, a file descriptor could point to a regular file, a device like a keyboard or monitor, a pipe, a network link, and so on.
When a process starts, it has three default file descriptors, as follows:
Redirection
A process (or command) receives input through its "standard input" and sends correct results to "standard output" and error messages to "standard error output."
Input/output redirection changes the default links of standard input (0), standard output (1), and standard error output (2) to other files.
Common Redirection Usages:
command > file1file1. Equivalent tocommand 1> file1.command >> file1file1. Equivalent tocommand 1>> file1.command 2> file1file1.command 2>> file1file1.command 2> /dev/null/dev/null(discard).command 1> file1 2>&1file1, and redirect standard error output to the same location.command 1>> file1 2>&1file1, and redirect standard error output to the same location.command &> file1command < file1file1. Equivalent tocommand 0< file1.The advantage of the combined redirection operator is that it simplifies the syntax, though there may be compatibility issues in some situations.
Pipes
The pipe symbol (
|) connects the standard output of one command to the standard input of the next command. Data flows through the pipe from one process to another, and each process modifies the data as it flows through.For example:
ls -il | wc | lessUsing Redirection and Pipes Together
Redirection sends standard output to a file or retrieves standard input from a file. A pipe connects the standard output of one process to the standard input of another.
When using both redirection and pipes together:
cat /etc/passwd >passwd.out | wc: If the redirection to a file occurs before the pipe symbol, the command after the pipe will receive an empty input since the standard output has already been redirected to a file.cat /etc/passwd | wc >passwd.out: If the pipe is placed before the redirection, the standard output being redirected is the output of the command after the pipe, not the command before it.If you want to save the standard output to a file and also use it as input for the next command, you can use the
teecommand.The
teecommand reads from standard input and writes to both standard output and a file.Examples:
ls /etc | tee etc.list | lessThis will overwrite the output of
ls /etcinto the fileetc.listand open it withless.ls /etc | tee -a etc.listThis appends the output of
ls /etctoetc.listwhile displaying it on the screen.To redirect both standard output and standard error into a pipe, simply redirect standard error to the same location as standard output:
command 2>&1 | command. (Note: The combined redirection operator cannot be used in this case.)Examples
Standard Output (1) Redirection:
user1@user1-PC:~$ dateThu Dec 14 12:19:06 CST 2023 # Standard output of the date commanduser1@user1-PC:~$ date >date.txt; wc date.txt; cat date.txt1 6 43 date.txt # Output redirected to date.txt, wc reads the file contentThu Dec 14 12:19:21 CST 2023 # cat reads date.txtuser1@user1-PC:~$ date 1>>date.txt; wc date.txt; cat date.txt2 12 86 date.txt # Output appended to the file, now contains two linesThu Dec 14 12:19:21 CST 2023 # First line of the fileThu Dec 14 12:19:34 CST 2023 # Second line of the fileuser1@user1-PC:~$ date 2>>date.txt; wc date.txt; cat date.txtThu Dec 14 12:19:58 CST 2023 # Error output redirected to the file, correct output to the screen2 12 86 date.txt # No error message, file content still two linesThu Dec 14 12:19:21 CST 2023 # First line of the fileThu Dec 14 12:19:34 CST 2023 # Second line of the fileStandard Error Output (2) Redirection:
user1@user1-PC:~$ asdf-bash: asdf: command not found # Error outputuser1@user1-PC:~$ asdf 2> /dev/null # Error output discardeduser1@user1-PC:~$ asdf 1> asdf.txt; wc asdf.txt; cat asdf.txt-bash: asdf: command not found # Error not redirected to the file, shown on screen0 0 0 asdf.txt # File is emptyuser1@user1-PC:~$ asdf 2> asdf.txt; wc asdf.txt; cat asdf.txt1 2 30 asdf.txt # Error output redirected to the file-bash: asdf: command not found # File contentuser1@user1-PC:~$ asdf 2>> asdf.txt; wc asdf.txt; cat asdf.txt2 4 60 asdf.txt # Appended to file, now contains two lines-bash: asdf: command not found # First line of the file-bash: asdf: command not found # Second line of the fileStandard Input Redirection:
user1@user1-PC:~$ wc /etc/passwd42 73 2543 /etc/passwd # Without redirection, includes the filename in the outputuser1@user1-PC:~$ wc42 73 2543 # With input redirection, no filename in the outputteeCommand Examples:user1@user1-PC:~$ date | tee date.txt ; wc date.txt; cat date.txtThu Dec 14 12:36:56 CST 2023 # tee command outputs to both the screen and the date.txt file1 6 43 date.txt # Content saved to date.txtThu Dec 14 12:36:56 CST 2023 # date.txt content matches the screen outputuser1@user1-PC:~$ date | tee date.txt | wc ; wc date.txt; cat date.txt1 6 43 # tee's standard output is piped to wc1 6 43 date.txt # wc reads date.txtThu Dec 14 12:37:27 CST 2023 # date.txt contentuser1@user1-PC:~$ date | tee date.txt >date2.txt ; wc date.txt date2.txt; cat date.txt date2.txt1 6 43 date.txt # Content written to date.txt by tee1 6 43 date2.txt # tee's standard output redirected to date2.txt2 12 86 totalThu Dec 14 12:38:01 CST 2023 # date.txt contentThu Dec 14 12:38:01 CST 2023 # date2.txt content matches date.txt