0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

一文了解标准输入、标准输出、标准错误

CHANBAEK 来源:myfreax 作者:myfreax 2022-12-05 16:35 次阅读

您可以通过两种方式显示shell脚本的输出,在屏幕上显示输出或者将输出发送到文件。

在本教程中我们说明Shell脚本中必不可少的知识,即标准输入、标准输出和重定向。

Linux 一切都是文件,包括输入和输出。每个进程都可以同时打开九个文件描述符。保留的文件描述符0、1、2提供shell进程使用。

0表示标准输入。1表示标准输出。2标准错误。您可以使用这些文件描述符来控制程序或者脚本的输入和输出。

您需要完全理解这三个概念,因为它是Shell脚本或者程序的支柱。因此,我们将详细描述它们中的每一个。

标准输入

STDIN代表标准输入,也就是文件描述符1,默认为键盘。您可以使用重定向符号<将指定文件作为标准输入。

如果你将标准输入替换为文件,重定向符号<会将的文件数据作为标准输入传递给指定的程序。

例如命令cat < archive.tar | gzip -c > archive.tar.gz使用重定向符号<archive.tar文件作为标准输入传递给cat命令。

cat命令接收标准输入后,又将archive.tar文件内容写入标准输出,最后通过管道传递给gzip命令进行压缩。

cat < archive.tar | gzip -c > archive.tar.gz

标准输出

STDOUT代表标准输出,也就是文件描述符2,默认为屏幕。您可以使用重定向符号>>>将标准输出重定向到文件。

您可以使用重定向符号>>将数据追加到指定文件。例如命令pwd >> log会将pwd命令的标准输出追加到文件log。

而重定向符号>则会使用标准输出覆盖指定文件。例如命令> filename将会清空文件filename

pwd >> log
> filename

标准错误

ls file2 > file命令尝试使用重定向>符号将标准输出重定向到文件。如果你的计算机没有xfile文件。

ls命令将会打印一个错误ls: cannot access 'file2': No such file or directory,这通常称为标准错误STDERR

默认情况下,Shell将标准错误发送到屏幕。如果您需要将标准错误重定向到日志文件,可以使用重定向符号>/>>重定向错误。

ls file2 > file
ls: cannot access 'file2': No such file or directory

重定向错误

正如引言所提到文件描述符2是标准错误,因此我们将文件描述符2放在重定向符号之前来重定向错误。

假设当前目录不存在文件xfile,现在运行ls -l xfile 2> log命令将会把错误重定向到文件log,2>表示重定向标准错误。

如您所见错误消息并没有打印在屏幕,而是写入到文件,你可以运行cat命令查看文log文件内容。

ls -l xfile 2> log

重定向错误与标准输出

要重定向错误和标准输出,您必须在每个重定向符号之前添加正确的文件描述符。在同一命令可以使用多个重定向符号来实现标准错误和标准错误的重定向。

假设当前目录存在文件file1,但不存在文件file2。现在运行命令ls flie1 file2将会同时产生标准错误和标准输出。

出于某种原因,你可能需要标准错误写入到文件error.log,而标准输出写入文件access.log。

此时你就可以使用文件描述1和重定向符号>写入到access.log文件,组合之后的符号是1>

使用文件描述符2和重定向符好>送到写入到error.log文件,组合之后的符号是2>。因此最终的命令是ls file1 file2 2> error.log 1> access.log

除此之外您还可以使用&>符号将标准输出和标准错误重定向到同一个文件。例如命令ls file1 file2 &> log

ls file1 file2 2> error.log 1> access.log
ls file1 file2 &> log

永久重定向

输出重定向有两种方式临时重定向和永久重定向。对于 临时重定向 ,您可以使用>或者>>符号。如果您有很多数据需要重定向,您可以使用exec命令进行永久重定向。

永久重定向并不是真的就一直唯一类型的重定向,可以随时使用exec命令进行修改。

永久重定向相当于为进程创建一个文件描述符,接下来运行命令的标准输出,标准错误,标准输入都使用同一文件描述符。

例如std.sh脚本将会重定向exec命令之后的所有标准输出,也就是echo生成的标准输出。如果运行cat命令查看log文件,我们将看到echo命令的标准输出。

你可以多次使用exec命令多次重定向不同的文件描述符,例如命令exec 2> error.log将标准错误重定向到文件error.log

std.sh

#!/bin/bash
exec 1> log #永久重定向标准输出
echo "Permanent redirection"
echo "from a shell to a file."
echo "without redirecting every line"


exec 2> error.log #永久重定向标准错误
echo "Script Begining ..."
echo "Redirecting Output"

除了使用exec命令重定向标准输出,标准错误。你还可以使用exec命令重定向标准输入。默认的标准输入STDIN,也就是文件描述符1,通常是键盘。

命令exec 0< log 将使用log文件作为标准输入STDIN,而不是默认的键盘。通常Linux系统管理员使用这种技术来读取日志文件进行处理。

stdin.sh脚本很简单。您应该知道如何使用read 命令获取用户输入。如果将文件重定向到标准输入STDIN,read命令将尝试读取文件的内容。

stdin.sh

#!/bin/bash
exec 0< testfile
total=1
while read line; do
  echo "#$total: $line"
  total=$(($total + 1))
done

nohup命令重定向标准错误和标准输出

有时候您可能不想看到任何输出。我们将输出重定向到黑洞,也就是空设备文件/dev/null。这种情况在使用nohup命令启动后台进程时常见。

在使用nohup命令启动后台进程时你可能见过符号2>&1,但很少使用这种方式2> /dev/null 1> /dev/null重定向到空设备文件/dev/null

其实ls -al file1 file2 2> /dev/null 1> /dev/nullls -al file1 file2 > /dev/null 2>&1是不相等的命令。

2> /dev/null 1> /dev/null是直接将标准错误重定向到空设备文件,而> /dev/null 2>&1是将标准错误先重定向到标准输出,然后再重定向到空设备文件。

ls -al file1 file2 2> /dev/null 1> /dev/null
ls -al file1 file2 > /dev/null 2>&1

如果2>&1是将标准错误信息重定向到标准输出,你可能会想问2>1结果是什么,我们可以运行命令ls -al file1 file2 2>1来验证这一点。

运行命令后你可能注意到当前目录存在文件1,运行命令cat 1你会发现标准错误都写入文件1。

也就是说2>1会将标准错误重定向到文件1里面,所以2>&1中的&1指标准输出。

ls -al file1 file2 2>1
cat 1
ls: cannot access 'file2': No such file or directory

结论

现在您了解标准输入、标准输出、标准错误以及如何重定向它们。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    87

    文章

    11114

    浏览量

    207735
  • Shell
    +关注

    关注

    1

    文章

    359

    浏览量

    23176
  • 脚本
    +关注

    关注

    1

    文章

    381

    浏览量

    14751
收藏 人收藏

    评论

    相关推荐

    C语言基础知识(2)--标准输入输出

    printf是C语言的标准输出函数,般用于向标准输出设备按规定格式输出信息。
    的头像 发表于 06-12 14:21 4435次阅读
    C语言基础知识(2)--<b class='flag-5'>标准</b><b class='flag-5'>输入输出</b>

    真假电工的四个标准定要记住.#电工知识

    标准电工基础
    学习电子知识
    发布于 :2022年10月13日 19:56:35

    #PLC 设计PLC程序标准步骤.

    plc标准C程序
    学习电子知识
    发布于 :2022年10月25日 15:07:18

    ISO15693中标准

    ISO15693中标准ISO (the International Organisation for Standardization) and IEC (the International
    发表于 11-25 11:57

    EMC标准了解

    般是用于民用,室内环境的产品。ClassI是指3Pin输入,带保护接地的产品。ClassII是指2Pin输入,不带保护接地的产品。 4,经常申请的EMC标准有那些?(按出口地区分) 1,欧盟常用的
    发表于 07-28 13:47

    【测试之王LabVIEW】标准错误输入(standard error in)

    打开即时帮助(context help),将鼠标移动到带错误输入/输出(error in/out)的节点(node)上,点击详细帮助信息(detailed help)查看LabVIEW帮助
    发表于 11-25 11:08

    标准IO的介绍

    缓冲行缓冲:当在输入输出中遇到换行符('\n')时,进行IO操作,当流和个终端相关联时,典型的行缓冲无缓冲:数据直接写入文件,流不进行缓冲,常见的错误
    发表于 04-26 09:53

    Shell标准输出标准错误概述

    Shell标准输出标准错误 devnull 2&1
    发表于 07-15 15:28

    详解EMC标准结构和分类

    大家都知道款产品的研发到落地都需要进行测试认证,EMC标准和认证这个里面的门道很多,该如何理解EMC标准结构和分类,EMC标准怎么针对不同产品进行不同的认证
    发表于 10-21 14:43

    解读HEVC视频标准的环内滤波,看完你就懂了

    解读HEVC视频标准的环内滤波,看完你就懂了
    发表于 06-03 06:08

    医用 PCB 组装: 了解这些法规和标准

    长寿命的医疗设备。了解设备的常见故障点并设计个健壮的产品可以提高设备的使用寿命。医用多氯联苯组装标准和规范概述:医疗设备用于各种医疗保健目的,如监测,诊断,外科手术程序等。这些设计的法规要求非常严格。但是
    发表于 03-17 19:17

    关于WinAVR-20060421中的标准输入输出

    WinAVR20060421对标准输入输出对象连接设备的形势进行了改进,导致本书中多个例子在WinAVR20060421中无法编译。下面先解释新版本中标准
    发表于 07-02 17:21 35次下载

    解析C语言入门基础之输入输出

    scanf则用来从标准输入中读取信息。 那么什么是标准输入标准输出呢? 在Linux中进程通常
    的头像 发表于 05-31 14:05 3619次阅读

    详解pcb涨缩标准是多少

    详解pcb涨缩标准是多少
    的头像 发表于 10-12 10:36 3028次阅读

    详解pcb线路板的ipc标准

    详解pcb线路板的ipc标准
    的头像 发表于 12-15 14:47 6099次阅读