摘要
为了有效地让 Linux 程序协同工作,我们需要对命令输入输出进行重定向(Redirection),并将一个命令的输出通过管道(Pipes)连接到另一个程序的输入。本文将介绍如何在 Linux 中使用输入输出重定向。
引言 输入输出文本流(I/O Stream) 表1 bash 使用的三种标准输入输出流 字段描述文件描述符stdin标准输入流0stdout标准输出流1stderr标准错误输出流2 命令执行过程(Command Execution)对于任何一条 Linux 命令执行,都是这样一个过程:用户从键盘或其它输入设备输入,输入通过 stdin 交给命令,命令执行。如果命令执行成功,会把成功结果通过 stdout 输出到输出设备上;如果命令执行出错,会把错误结果通过 stderr 也输出到输出设备上。
用法 输出重定向(Output Redirection)将某个命令默认指向 stdout 或 stderr 的输出文件转而指向一个文件,即使得命令输出到某个指定文件中,而不是输出到终端屏幕或终端窗口。Linux 中使用 > 和 >> 来重定向标准输出。
ls 1>stdout.txt
:重定向标准输出到 stdout.txt 文件。若该文件原本不存在,则文件将被创建;否则,文件内容将被强制覆盖。当然,如果不想文件内容被覆盖,可以使用将>
改为>>
,该命令将标准输出追加到文件末尾。ls 4.txt 2>stderr.txt
:重定向标准错误输出到 stderr.txt 文件。其它用法同上。ls 1.txt 4.txt 1>stdout.txt 2>stderr.txt
:分别重定向标准输出到 stdout.txt 文件,标准错误输出到 stderr.txt 文件。其它用法同上。ls 1.txt 4.txt &>std.txt
:使用&
重定向标准输出和错误输出到同一个文件。其它用法同上。
$ ls # 重定向前的成功输出(直接在终端窗口显示)
1.txt 2.txt 3.txt
$ ls 4.txt # 重定向前的错误输出(直接在终端窗口显示)
ls: 无法访问 '4.txt': 没有那个文件或目录
$ ls 1>stdout.txt # 重定向标准输出到 stdout.txt
$ cat stdout.txt
1.txt
2.txt
3.txt
stdout.txt
$ ls 1>>stdout.txt
$ cat stdout.txt
1.txt
2.txt
3.txt
stdout.txt
1.txt
2.txt
3.txt
stdout.txt
$ ls 4.txt 2>stderr.txt
$ cat stderr.txt
ls: 无法访问 '4.txt': 没有那个文件或目录
$ ls 1.txt 4.txt 1>stdout.txt 2>stderr.txt
$ cat stdout.txt
1.txt
$ cat stderr.txt
ls: 无法访问 '4.txt': 没有那个文件或目录
$ ls 1.txt 4.txt &>std.txt
$ cat std.txt
ls: 无法访问 '4.txt': 没有那个文件或目录
1.txt
文件输出重定向的应用
- 结合 echo 命令创建文本文件
echo -e "1 apple\n2 pear\n3 banana"
:输出信息到终端窗口echo -e "1 apple\n2 pear\n3 banana" > fruit.txt
:重定向输出信息到文本文件
$ echo -e "1 apple\n2 pear\n3 banana"
1 apple
2 pear
3 banana
$ echo -e "1 apple\n2 pear\n3 banana" > fruit.txt
$ cat fruit.txt
1 apple
2 pear
3 banana
- 忽略命令错误输出
ls 1.txt 4.txt 2>stderr.txt
:将错误输出重定向到/dev/null
,只查看正确输出。(/dev/null
是一个非常特殊的块设备文件。可以视为系统的黑洞,写入到这个文件中的东西都会被丢弃掉,因此可以用来写入想忽略的错误输出)
$ ls 1.txt 4.txt
ls: 无法访问 '4.txt': 没有那个文件或目录
1.txt
$ ls 1.txt 4.txt 2>>/dev/null
1.txt
输入重定向(Input Redirection)
输入重定向是指让命令从指定文件中获取输入,而非从 stdin(常常指的是键盘输入)中获取输入。Linux 中使用 < 和
关注
打赏
热门博文
- 【Python】旋转矩阵与旋转向量的相互转换(OpenCV)
- 记录配置打印机遇到的三个问题
- 【PyTorch】切记:GeForce RTX 3090 显卡仅支持 CUDA 11 以上的版本!
- Human3.6M 数据集介绍及下载
- 解决DCNv2在Linux上安装失败的问题
- 【原创工具 | OpenCV-CamCalib】一个基于 OpenCV 的自动化相机数据采集和标定程序
- 【Windows】局域网内共享文件夹的设置方法
- 【Python】根据 URL 读取网络图片的两种方式(OpenCV)
- 【Linux】Ubuntu 20.04 深度学习 GPU 环境配置(CUDA Toolkit 11.7 + cuDNN v8.4.1)
- 【Qt for Python】控件显示问题(默认不显示没有父控件的控件)