摘要
为了有效地让 Linux 程序协同工作,我们需要对命令输入输出进行重定向(Redirection),并将一个命令的输出通过管道(Pipes)连接到另一个程序的输入。本文将介绍如何在 Linux 中使用输入输出重定向。
引言
输入输出文本流(I/O Stream)
字段 | 描述 | 文件描述符 |
---|---|---|
stdin | 标准输入流 | 0 |
stdout | 标准输出流 | 1 |
stderr | 标准错误输出流 | 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 中使用 < 和 << 来重定向标准输入。
文件输入重定向的应用
- 结合 tr 命令使用。tr 命令往往用于从标准输入中替换特定字符,并将结果写到标准输出。tar 命令的用法:
tr [准备要替换的字符] [要替换成的字符]
。
-
tr ' ' '\t' <fruit.txt
:从 fruit.txt 获取输入,并将字符替换后的结果写到标准输出。
$ cat fruit.txt
1 apple
2 pear
3 banana
$ tr ' ' '\t' <fruit.txt
1 apple
2 pear
3 banana
- 结合 sort 命令使用。sort 命令用于对文本文件内容按照规定字段进行排序。sort 命令的用法:
sort -k [关键字字段序号] [要排序的文本文件]
。
-
sort -k2 <fruit.txt
:直接将 fruit.txt 文件传递给 sort 进行排序。 -
sort -k2 <<EOF
:将界定符 EOF 之前的内容作为一个文件传递给 sort 进行排序。
$ sort -k2 <fruit.txt
1 apple
3 banana
2 pear
$ sort -k2 <<EOF
> 1 apple
> 2 pear
> 3 banana
> EOF
1 apple
3 banana
2 pear
提示
有时候我们可能有这种需求:不仅需要将标准输出显示在终端窗口,同时还要将其保存到本地文件中,这样即使终端窗口关闭后,也能从本地文件中看到标准输出。对于该需求,在 Linux 中,我们可以借助 tee 命令来实现。
帮助文档:
$ tee --help
用法:tee [选项]... [文件]...
将标准输入复制到每个指定文件,并显示到标准输出。
-a, --append 内容追加到给定的文件而非覆盖
-i, --ignore-interrupts 忽略中断信号
-p 对写入非管道的行为排查错误
--output-error[=模式] 设置写入出错时的行为。见下面“模式”部分
--help 显示此帮助信息并退出
--version 显示版本信息并退出
模式确定向输出写入出错时的行为:
'warn' 对向任何文件输出出错的情况进行诊断
'warn-nopipe' 对向除了管道以外的任何文件输出出错的情况进行诊断
'exit' 一旦输出出错,则退出程序
'exit-nopipe' 一旦输出出错且非管道,则退出程序
-p 选项的默认模式是“warn-nopipe”。
当 --output-error 没有给出时,默认的操作是在向管道写入出错时立刻退出,
且在向非管道写入出错时对问题进行诊断。
具体示例
-
ls | tee log.txt
:直接在终端窗口列出文件,并将其标准输出保存至 log.txt 中。即使终端窗口关闭了,我们也可以使用cat log.txt
查看之前的输出结果。
$ ls
1.txt 2.txt 3.txt
$ ls | tee log.txt
1.txt
2.txt
3.txt
log.txt
$ cat log.txt
1.txt
2.txt
3.txt
log.txt
此外,如果你是人工智能研究人员,大体上都会使用 Python 编程。当我们运行一个 .py
格式的文件时,搭配 tee 命令使用可以实现在终端窗口显示 print 函数的输出信息,并将这些输出信息保存到本地文件。例如:python train.py | tee train.log
。文章来源:https://www.toymoban.com/news/detail-418869.html
参考
中国大学 MOOC | Linux系统管理 | 主题05 重定向与管道 | 小节 1 重定向文章来源地址https://www.toymoban.com/news/detail-418869.html
到了这里,关于【Linux】重定向(输入重定向 | 输出重定向)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!