重定向
在Linux中,标准输入是从键盘读入数据或命令等,标准输出是将命令的结果等输出到屏幕。
类型 | 设备 | 文件路径 | 文件描述符 | 描述 |
---|---|---|---|---|
标准输入0 | 键盘 | /proc/self/fd/0 | 0 | 从键盘获得输入 |
标准输出1 | 屏幕 | /proc/self/fd/1 | 1 | 输出到屏幕 |
错误输出2 | 屏幕 | /proc/self/fd/2 | 2 | 输出到屏幕 |
但使用 Linux 终端时,经常需要将命令的输出重定向到文件或其他命令中,这时需要使用到重定向技术。
重定向是一种非常有用的技术,可以将命令的输出从标准输出流发送到文件或其他进程的输入流。
在 Linux 中有三种常见重定向方式:输出重定向、输入重定向和错误重定向。
输出重定向
将某个命令默认指向的输出文件转而指向一个文件,即使得命令输出到某个指定文件中,而不是输出到终端屏幕或终端窗口。
Linux 中使用 >
和 >>
来重定向标准输出。
输出重定向
输出重定向是将命令输出的内容写入到文件或其他进程中。
在 Linux 中,我们可以使用 >
符号来将命令的输出重定向到一个文件中。
如,下面的命令将会把 "s
命令的输出写入到 files.txt 的文件中。
ls > files.txt
若 file.txt 文件不存在,则文件将被创建;否则,文件内容将被强制覆盖。
输出追加重定向
如果想要将输出追加到文件末尾而不是覆盖它,可以使用 >>
符号。
如,下面的命令将会将 ls
命令的输出追加到 files.txt 文件的末尾:
ls >> files.txt
使用重定向在bash中写入文件
有一条有意思的命令是cat >file <<EOF
,该命令使用了输出重定向,可以用脚本非交互式的编写文件并显示内容。如:
用户可以一直输入文本,直到输入 "EOF"为止。
输入重定向
输入重定向是将文件的内容发送到命令中,而不是从键盘输入。使用 <
符号来将文件中的内容重定向到命令中。
如,下面的命令将会将 input.txt 文件的内容发送给 sort
命令进行排序:
sort < input.txt
错误重定向
错误重定向是将命令的错误输出重定向到文件或其他进程中。使用 2>
符号将命令的错误输出重定向到文件中。
如,下面的命令将会将 ls
命令的错误输出写入到 error.txt 的文件中:
ls file2.txt 2> error.txt
追加重定向
与输出追加重定向一样,使用>>
来追加输出。
如,下面的命令将会将 ls
命令的错误输出追加写入到 error.txt 的文件中:
ls file2.txt 2>> error.txt
分别重定向
分别将标准输出和错误输出定向到两个文件内,使用1>
和2>
。如:
ls file.txt 1>stdout.txt 2>stderr.txt
该命令会分别重定向标准输出到 stdout.txt 文件,标准错误输出到 stderr.txt 文件。
全部重定向
使用 &>
来将标准输出和错误输出全部重定向到指定文件。如:
ls file.txt 1&>stdout.txt
该命令会将所有输出全部重定向到 stdout.txt 文件。
或者使用命令 >> 文件 2>&1
来全部重定向。如:
ls >> file.txt 2>&1
特殊文件
Linux中存在两个特殊文件,可以用来配合重定向一起使用实现功能。
/dev/null
黑洞文件 /dev/null
是一个特殊的设备文件,写入黑洞文件的数据都会被清空。通常用于丢弃不需要的数据输出,或作为用于输入流的空文件。
- 丢弃无用输出流
ls file.txt 1>stdout.txt 2> /dev/null
将命令的标准输出重定向到 stdout.txt 文件,将错误输出写入黑洞文件(即丢弃)。
- 清空文件
cat /dev/null>file.txt
将黑洞文件写入 file.txt ,即清空 file.txt 文件。
其他可用的清空文件的方法:
echo >file.txt
echo "">file.txt
echo -n "" >file.txt
:>file.txt
/dev/zero
和/dev/null类似,/dev/zero也是一个特殊的字符设备文件。当我们使用或读取它的时候,它会提供无限连续不断的空的数据流,主要的用处是用来创建一个指定长度用于初始化的空文件,或以覆盖的方式清空文件。
如:
dd if=/dev/zero of=./output.txt bs=1024 count=1
该命令会产生一个大小为1kb的空文件output.txt
续不断的空的数据流,主要的用处是用来创建一个指定长度用于初始化的空文件,或以覆盖的方式清空文件。
如:
dd if=/dev/zero of=./output.txt bs=1024 count=1
该命令会产生一个大小为1kb的空文件output.txt