一文搞懂Linux的标准输出/错误重定向

这篇具有很好参考价值的文章主要介绍了一文搞懂Linux的标准输出/错误重定向。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

 今天在写一个脚本时,需要将shell命令和可执行程序的输出重定向在某一个log文件中,但是遇到了点小问题,索性就研究下输出重定向到底怎么回事。

 Linux系统,有一个非常重要概念,就是一切皆文件。在使用shell脚本时,系统为了能够进行接收外部输入,同时向外部输出,将三个文件始终保持在打开的状态,并使用三个文件描述符0,1,2来分别指向这三个文件,以此来完成标准输入,标准输出,标准错误输出。

  • 标准输入:由键盘输入

  • 标准输出:输出到屏幕

  • 标准错误:输出到屏幕

 在正常情况下,我们执行shell命令时,其输出总是标准输出或者标准错误,因此总是会将输出的信息,不论是正常信息还是报错信息,都会打印在屏幕上,但有时我们不希望这些输出打印在屏幕上,而是希望这了信息能被保存到指定的文件中,这就是输出重定向。

 那么,究竟什么是标准输入/标准输出/标准错误呢?下面为大家一一介绍。

1.标准输出

 在终端输入

echo hello
hello

 终端会打印hello,但是我们echo出来的hello,到底去了什么地方?

 每个基于 Unix 的操作系统都有一个“输出的默认位置”的概念。由于这个短语比较啰嗦,所以大家都称它为“标准输出”或“stdout”,读作standard out。 shell(可能是 bash 或 zsh)一直在监视默认输出位置。当 shell 在标准输出那里看到新的输出时,它会将其打印在屏幕上,以便我们可以看到它。否则,shell不去监视标准输出位置,echo hello会将“hello”发送到那个默认位置,但我们却看不到。

2.标准输入

 标准输入(stdin)是命令监听信息的默认位置,尝试在终端输入cat,不添加任何参数

cat 
hello
hello
1234
1234

 不论输入什么,shell会将你的输入再次打印,shell怎么读取到你的输入呢,和标准输出类似,shell会一直监视默认输入位置,一有新的输入进来,shell便会把数据读进来,然后输出到stdout

3.标准错误

 标准错误(stderr)和stdin/stdout很像,区别就是stderr是错误信息存储的地方,例如, cat一个不存在的文件

cat ttt
cat: ttt: No such file or directory

 似乎和stdout没什么两样,但是我们借助管道来验证一下,在linux中,管道是将一个命令的stdout连接到另一个命令的stdin,可以使用管道符号|来完成这个操作,例如

echo "hello there"
hello there
echo "hello there" | sed "s/hello/hi/"
hi there

 这里的sed是将hello替换为hi,上面命令中,echo将hello there传输到标准输出,然后通过管道将hello there将其作为标准输入传递给sed,sed对其进行操作后,再输出到标准输出。

 那cat打印出的信息,到底是stdout呢还是stderr呢?看这个命令

cat ttt | sed "s/No such/hello world/"
cat: ttt: No such file or directory

  如果 cat ttt打印出来的信息是stdout的话,那No such会被替换成hello world,但似乎并没有被替换到,是的,cat ttt打印出的信息,是stderr而不是stdout。管道只会接收stdout,而不会接收stderr

4. 重定向

 这里我们终于可以知道什么是重定向了,默认情况下,我们shell执行的命令的输出一定会到stdout或者stderr,如果我们不想让信息输出到stdout或者stderr,那就要用到重定向了,我们可以使用>将输出进行重定向。

$ echo "hello world" > file
$ cat file
hello world

 这行命令做了两件事

  • file不存在,则创建
  • file存在,则用hello world覆盖其内容

 如果只是想追加内容而不是覆盖原有内容,则可以使用>>

$ echo "hello world" > file
$ cat file
hello world
$ echo "go go go" >>file
$ cat file
hello world
go go go

 其中,如果>或者>>前不添加文件描述符,则默认是将标准输出重定向到file,如果想重定向stderr,则需要表示为1 > file或者2 > file

5.文件描述符

 文件描述符(File descriptor)是表示输入/输出源的正整数,例如stdin是0,stdout是1,stderr是2,这些数字是由POSIX标准定义的,MacOS和Linux都实现了这个标准的一部分。

如果想将输出重定向到某一文件描述符,则需要借助>&运算符并跟上文件描述符来完成

# Redirect stdout to stdout (FD 1)
echo "hello there" >&1
hello there
# Redirect stdout to stderr (FD 2)
echo "hello there" >&2
hello there

 这和上面的输出重定向到某一文件基本一样,只不过重定向的最终目标变成了stdoutstderr,让我们继续通过管道看看这两个输出有什么区别

echo "no changes" >&1 | sed "s/no/some/"
some changes
# Redirect to stderr, so it does not come through
echo "no changes" >&2 | sed "s/no/some/"
no changes

 原理还是和上面一样,第一行将输出重定向到了标准输出,所以管道会将其传递给sed,第二行经echo的输出重定向到了标准错误,管道无法传递。

6.将stderr重定向到stdout

 如果一个脚本,将输入的参数的三个参数分别重定向到了stdout stderr stdout,那么一个命令就出现了两种不同的输出,使用管道时,就无法传递全部的输出作为下个命令的输入,我们编写一个这样的command

#!/bin/bash

for f in $@; do
  if [[ $f == "file2" ]]; then
    echo "stderr file2" >& 2
  else
    echo "stdout $f"
  fi
done
$ bash command file1 file2 file3
stdout file1
stderr file2
stdout file3

 用管道来处理,则只会处理部分,file2是stderr,无法被管道抓取。

$ bash command file1 file2 file3 | sed "s/^/Robot says: /"
stderr file2
Robot says: stdout file1
Robot says: stdout file3

 我们可以通过2>&1将标准错误重定向给标准输出,例如

cat ttt 2>&1 | sed "s/No such/hello world/"
cat: ttt: hello world file or directory

 由于stderr重定向到了stdout,管道就将输出的信息传递给了sed,sed做了处理并输出到stdout

同样的,对于command也可以这样做

dexu_tian@VM-4-10-ubuntu:~/Tmp/outputRedirect$ bash ./command file1 file2 file3 2>&1 | sed "s/std/Robot says: std/"
Robot says: stdout file1
Robot says: stderr file2
Robot says: stdout file3

7. 常用用法

 比较常见的用法是将一个命令的stdoutstderr都重定向到某一个文件中,那么它的写法就应该是这样的

cmd > logfile 2>&1

 cmd的stdout将会被重定向到logfile,stderr将会被重定向到stdout,由此实现了stderrstdout被重定向到了logfile.

 像2>&1一样,如果想重定向文件描述符,则需要表示为N >&M,其中N和M是文件描述符,其为1和2时,就是在重定向stdout和stdin了。如果M不是文件描述符,则使用文件名N>filename

8.输出静音

 我们可以通过这种重定向的语法,将所有的输出重定向到/dev/null, 它会吞下所有接收到的内容并且不做任何操作。

echo "hello there" >/dev/null

以上就是本文所要分享的内容,希望大家每天坚持进步~文章来源地址https://www.toymoban.com/news/detail-425303.html

到了这里,关于一文搞懂Linux的标准输出/错误重定向的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Bash将输出同时重定向到标准输出stdout和文件

    本文参考How to redirect output to a file and stdout。 对于任意原本默认输出到标准输出 stdout 的程序或命令 foo ,只需执行 即可同时输出到 output.file 文件。 例如,若想输出当前目录下的所有目录与文件到标准输出 stdout 的同时保存到 output.file 文件,执行 如果同时想输出程序或命令的

    2024年04月14日
    浏览(43)
  • 文件操作--文件的随机读写、标准输入输出重定向

    目录 一、文件的随机读写 二、便准输入输出重定向         前面的例程执行的都是顺序文件处理(Sequential File Processing)。在顺序文件处理过程中,数据项是一个接着一个进行读取或者写入的。例如,如果想读取文件中的第5个数据项,那么使用顺序存取方法必须先读取前

    2024年02月15日
    浏览(42)
  • 【机器学习】一文搞懂标准化,归一化,正则化

    对于机器学习中的标准化,归一化和正则化的理解,一直都比较模糊,而且在许多技术书籍中,对于它们的使用基本都是一笔带过,不理解概念的话,就不知具体对数据做了哪些操作。因此,在这里专门对这几个概念做学习与总结。 学习之前,先抛出几个问题: 这几个概念

    2024年02月03日
    浏览(49)
  • SDIO(安全数字输入输出)/协议 三、一文搞懂SDIO

      目录 一、SDIO:安全数字输入输出  目录 定义 功能 二、SDIO协议 介绍 信号 协议 一般协议 写协议 读协议 命令 命令格式 命令应答 数据 三、一文搞懂SDIO 四、SDIO简介  五、SD卡引脚定义和图连接  六、SDIO协议简介 七、MMC、SD、TF、SDIO、SDMMC简介  SDIO_百度百科 SDIO(Secure

    2024年02月11日
    浏览(36)
  • 【Linux】重定向(输入重定向 | 输出重定向)

    为了有效地让 Linux 程序协同工作,我们需要对命令输入输出进行重定向(Redirection),并将一个命令的输出通过管道(Pipes)连接到另一个程序的输入。本文将介绍如何在 Linux 中使用输入输出重定向。 输入输出文本流(I/O Stream) 表1 bash 使用的三种标准输入输出流 字段 描述

    2023年04月20日
    浏览(34)
  • Linux输入输出重定向

    目录 Linux输入输出重定向 Linux中的默认设备 输入输出重定向定义 输入输出重定向操作符 实用形式 标准输入、标准输出、标准错误 输出重定向案例 案例1 --- 输出重定向(覆盖) 案例2 --- 输出重定向(追加)  案例3 --- 错误输出重定向 案例4 --- 正确和错误都输入到相同位

    2024年02月04日
    浏览(51)
  • Python中标准输入(stdin)、标准输出(stdout)、标准错误(stdout)的用法

    input()、raw_input() Python 3.x 中 input() 函数可以实现提示输入,python 2.x 中要使用 raw_input(),例如: sys.stdin 使用 sys.stdin 可以获取标准输入的文件句柄对象,例如: print print 可以自动换行,例如: sys.stdout 使用 sys.stdout 可以获取标准输出的文件句柄对象,例如: 执行结果与 pri

    2024年02月12日
    浏览(42)
  • Linux操作实例 – 输入输出重定向

    By Jackson 1. 前言 在操作计算机的时候,我们能够很容易通过键盘、鼠标给计算机输入信息(例如:写公文、邮件,同时通过显示器得到输出。这就是日常和计算机进行人机对话的过程。 使用Linux操作系统,由于天生需要用命令行来交互,给使用者增加了些许难度。本文简要介

    2024年02月02日
    浏览(41)
  • 「Linux系列」Shell 输入/输出重定向

    在Shell中,输入重定向允许你将一个文件或命令的输出作为另一个命令的输入,而不是从标准输入(通常是键盘)读取。这是通过特殊符号 实现的。使用输入重定向,你可以将文件的内容作为命令的输入,从而执行特定的操作。 下面是一个Shell输入重定向的案例: 假设你有一

    2024年04月15日
    浏览(46)
  • 【Linux学习】之将输出重定向到文件或程序

    1. 标准输入、标准输出和标准错误 进程使用称为文件描述符的编号通道来获取输入并发送输出。所有进程在开始时至少要有三个文件描述符: 标准输入(通道0 ) 从键盘读取输入。 标准输出(通道 1) 将正常输出发送到终端。 标准错误(通道 2) 将错误消息发送到终端。 如果程序

    2024年02月02日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包