精华内容
参与话题
问答
  • 2. 标准输出(输出到屏幕) 对应文件描述符1 3. 标准错误(也是输出到屏幕) 对应文件描述符2 常用方法 >/dev/null 2>&1 实际上,应该等同于这样:1 > /dev/null 2 > /dev/null ,默认情...

    相关概念

    默认情况下,总是有三个文件处于打开状态

    1. 标准输入(键盘输入)           对应文件描述符0
    2. 标准输出(输出到屏幕)      对应文件描述符1
    3. 标准错误(也是输出到屏幕)    对应文件描述符2

    常用方法

    >/dev/null 2>&1
    
    实际上,应该等同于这样:1 > /dev/null 2 > /dev/null ,默认情况下就是1,标准输出,所以一般都省略。
    而&号,后面接的是必须的文件描述符。
    不能写成2>1,这样就成了标准错误重定向到文件名为1的文件中了,而不是重定向标准错误到标准输出中。
    所以这里就是:标准输出重定向到了/dev/null,而标准错误又重定向到了标准输出,
    所以就成了标准输出和标准错误都重定向到了/dev/null
    
    2>&1 >/dev/null
    事实上, 命令行的重定向什么的, 是在执行命令之前就准备好了的。
    解释顺序从左至右依次进行, 2>&1 ,而1是屏幕, 所以标准错误重定向到屏幕, 
    再而 1>/dev/null , 即标准输出重定向到 /dev/null, 上述2>&1 >/dev/null
    并不是什么同一时刻要么产生标准输出要么产生标准错误. 而是两个不同的东西.
    
    用以下变量的方式做个解释,就很明显了,这两种方式是不同的,前者就像:
    a=1
    b=a
    
    而后者就像:
    b=a
    a=1
    
    &>/dev/null
    # 这个就是,不管你是啥玩意儿文件描述符,通通重定向到/dev/null

    整理

    &   一般是表示产生一个子shell,即后台运行
    但在这里的&是一个标志,是个规定,这个符号后面的数字代表一个文件描述符
    &1  这表示标准输出
    &2  标准错误输出
    2>&1    将标准错误重定向到标准输出

    实例

    • 实例讲解
      1 #!/bin/bash
      2 
      3 date +%F > 1019
      4 date +% F 2> 1020
    
    date +%F    的标准输出是2017-10-19
    date +% F   的标准输出是空,只有标准错误输出
        [root@localhost ~]# date +% F
        date: extra operand `F'
        Try `date --help' for more information.
    1. 想要将错误输出重定向到文件直接重定向是不行的
        date +% F > 1020
    2. 若要做的的话需要这样写
        date +% F 2> 1020
    3. 假设这样写
        date +% F >&2 1020  #开始我这样写的,但这是错误的
     #因为这个意思是将标准输出重定向到标准输出,
     #而此时的标准输出为空,所以1020文件为空
    • 实例中发现的问题
        [root@localhost ~]# head 1 2
        ==> 1 <==
        2222
    
        ==> 2 <==
        1111
        [root@localhost ~]# awk '{print $0}' 1 2
        2222
        1111
        [root@localhost ~]# awk '{print $0}' 1 2>file
        2222
        [root@localhost ~]# awk '{print $0}' 1 2 >file
    #这里就出现了一个有趣的现象,2后面的空格问题
    #当2后面没有空格时,shell就默认2>为一体,识别为标准错误输出
    #因为这里的文件名2与标准错误输出的文件描述符冲突了
    
    #当2后面有空格时,shell就识别2为文件名,作为awk的参数来处理

    参考链接六神的CSDN

    转载于:https://www.cnblogs.com/irockcode/p/7692509.html

    展开全文
  • 获取进程的标准输出

    千次阅读 2019-05-23 22:11:13
    起因是我想看到spring项目的标准输出,注意不是日志输出是标准输出,我想到了spring就是一个java进程,怎么能够获取到这个进程的标准输出呢?首先找到进程号,然后获取进程的标准输出。linux一切到可以看作文件,/...

    起因是我想看到spring项目的标准输出,注意不是日志输出是标准输出,我想到了spring就是一个java进程,怎么能够获取到这个进程的标准输出呢?首先找到进程号,然后获取进程的标准输出。linux一切到可以看作文件,/proc/pid/fd/1 就是pid进程的标准输出。

    0描述符 标准输入
    1描述符 标注输出
    2描述符 标注错误输出

    文件描述符指向了管道或者文件或者socket
    在这里插入图片描述

    标准输出指向了终端
    在这里插入图片描述

    展开全文
  • 标准输入和标准输出

    2020-07-30 21:47:22
    2 标准输出(STDOUT) -1 默认输出到终端窗口 3 标准错误(STDERR) -2 默认输出到终端窗口 I/O 重定向 redirect I/O 重定向:将默认的输入,输出或错误对应的设备改变,指向新的目标 标准输出和错误重新定向 命令格式...

    标准输入和输出

    Linux 给程序提供三种I/O 设备
    1 标准输入(STDIN) -0 默认接受来自终端窗口的输入
    2 标准输出(STDOUT) -1 默认输出到终端窗口
    3 标准错误(STDERR) -2 默认输出到终端窗口

    I/O 重定向 redirect

    I/O 重定向:将默认的输入,输出或错误对应的设备改变,指向新的目标

    标准输出和错误重新定向

    命令格式:命令 操作符号 文件名

    支持的符号包含:
    1>>	把STDOUT	重定向到文件
    2>		 把STDERR 重定向到文件
    &>		 把标准输出和错误都重定向
    >&		 同上,建议使用上面方式
    >>		 可在原有内容基础上,追加内容
    
    如果文件已存在,文件内容会被覆盖
    set -C	禁止将内容覆盖已有文件,但可追加,利用 >| 仍可强制覆盖
    set +C	允许覆盖,默认
    
    

    追加
    把输出和错误重新定向追加到文件
    >> 追加标准输出重定向至文件
    2>> 追加标准错误重定向至文件

    标准输出和错误输出各自定向至不同位置

    cmd	> /path/to/file.out 2> /path/to/error.out
    

    合并标准输出和错误输出为同一个数据流进行重定向
    &> 覆盖重定向
    &>> 追加重定向

    cmd > /path/to/file.out 2>&1 (注意顺序)
    cmd	>> /path/to/file.out 2>&1
    

    合并多个程序,使用() 和{}
    (cmd1;cmd2;…cmdn)或{ cmd1;cmd2;…cmdn }合并多个程序的STDOUT

    ps:
    1 命令后必须用 ; 分割
    2 {} 跟命令之间必须有空格,否则会报错
    

    范例

    #标准错误重定向
    [root@centos8 data]#rm /data/f1.log 2> /data/all.log
    
    #合并多个命令的结果至一个文件中
    [root@centos8 data]#(cal 2019;cal 2020;) > all.txt
    [root@centos8 data]#{ cal 2019;cal 2020; } > all.txt
    
    #清除大文件
    [root@centos8 data]#cat /dev/null > /data/file.log
    
    #分别重定向
    [root@centos8 data]#ls /data/ /xxx > stdout.log 2> stderr.log
    
    #将标准输出和错误都重定向到同一个文件,(顺序很重要)
    [root@centos8 data]#ls /data /xxx > /data/all.log 2>&1 
    [root@centos8 data]#ls /data /xxx 2> /data/all.log 1>&2
    [root@centos8 data]#ls /data /xxx &> /data/all.log
    #错误示范
    [root@centos8 data]#ls /data /xxx 2>&1 > /data/all.log
    ls: cannot access '/xxx': No such file or directory
    
    #修改密码
    [root@centos8 ~]#passwd dawn &> /dev/null
    

    标准输入重定向

    从文件中导入STDIN,代替当前终端的输入设备,使用 < 来重定向标准输入。某些命令能够接受从文件中导入STDIN

    #将bc.log中的公式输入给bc 命令,然后将计算后的结果写入bc2.log 中
    [root@centos8 data]#bc > bc2.log < bc2.log
    [root@centos8 data]#cat mail.txt
    [root@centos8 data]#mail -s test dawn < mail.txt
    [root@centos8 data]#cat < mail.txt > mail2.txt
    
    #利用标准输入重定向,实现备份
    [root@centos8 ~]#cat > issue.bak < /etc/issue
    [root@centos8 ~]#cat issue.bak 
    \S
    Kernel \r on an \m
    
    #单行重定向
    [root@centos8 data]#cat > cat.log
    line1
    line2
    

    多行重定向
    使用 <<终止词 命令从键盘吧多行重导向给STDIN,直到终止词位置之前的所有文本都发送给STDIN,有时被称为就地文本(here documents)

    1 分隔符理论时任意普通字符串,如:!, @, $, EOF(End Of File), dawn等,但建议使用EOF
    2 分隔符必须是独立一行内容,前后不能有其他字符
    3 <<- 可自动删除输入行及最后的分隔符对应行中的所有制表符tab,实现行的对齐效果。常用于脚本

    [root@centos8 data]#cat > cat.log <<@
    > abc
    > xxx
    > yyy
    >  @
    > @da
    > dafd
    > @
    #常用的是EOF
    [root@centos8 data]#cat > dawn.log <<EOF
    > hello
    > dawn
    > EOF
    

    范例

    #利用多行重定向,发邮件给另一个用户,标题为hello
    #准备工作
    #1 安装邮箱协议服务,且启动服务,端口号为25
    [root@centos8 data]#yum -y install postfix;systemctl enable --now postfix
    #2 安装邮箱服务
    [root@centos8 data]#yum install mailx -y
    #3 发送邮件给dawn
    [root@centos8 data]#mail -s "hello" dawn <<EOF
    > Hello,I am `whoami`
    > The hostname is $HOSTNAME
    > EOF
    
    #4 登录dawn 用户,就可以看到邮件
    [dawn@centos8 ~]$ mail
    Heirloom Mail version 12.5 7/5/10.  Type ? for help.
    "/var/spool/mail/dawn": 1 messages 1 new
    >N  1 root                  Fri Jul 31 20:19  19/577   "hello"
    & 1
    Message  1:
    From root@centos8.dawn  Fri Jul 31 20:19:09 2020
    Return-Path: <root@centos8.dawn>
    X-Original-To: dawn
    Delivered-To: dawn@centos8.dawn
    Date: Fri, 31 Jul 2020 20:19:09 +0800
    To: dawn@centos8.dawn
    Subject: hello
    User-Agent: Heirloom mailx 12.5 7/5/10
    Content-Type: text/plain; charset=us-ascii
    From: root <root@centos8.dawn>
    Status: R
    
    Hello,I am root
    The hostname is centos8.dawn
    
    

    总结常用的几种情况

    #标准输出不显示
    [root@centos8 data]#ls 2>&1 > /dev/null
    [root@centos8 data]#ls a.txt 2>&1 > /dev/null
    ls: cannot access a.txt: No such file or directory
    
    #错误输出不显示
    [root@centos8 data]#ls abc123 2> /dev/null
    [root@centos8 data]#ls 2>/dev/null
    1                                mysql
    1.sql                            mysql-5.7.20-linux-glibc2.12-x86_64.tar.gz
    
    #都不显示,丢弃
    [root@centos8 data]#ls &>/dev/null
    [root@centos8 data]#ls aaa &>/dev/null
    
    #保存错误输出
    [root@centos8 data]#ls aaa >/dev/null 2>/tmp/log
    [root@centos8 data]#cat log
    ls: cannot access aaa: No such file or directory
    
    展开全文
  • 相同&lt;1&gt; 两者都是默认将信息输出到终端。&lt;2&gt; 可通过setvbuf来改变其输出方式。不同:&... stdout默认是基于行的... 如果将输出定向到文件,标准输出会将信息输出到文件,而标准错则...
    相同
    <1> 两者都是默认将信息输出到终端。
    <2> 可通过setvbuf来改变其输出方式。

    不同:
    <1> stdout默认是基于行的缓冲,即字符会缓冲起来,直到碰到换行符、缓冲区满、fflush或者文件关闭(程序返回退出)的时候才将这些字符输出;而stderr是无缓冲的,字符会直接输出。
    <2> 如果将输出定向到文件,标准输出会将信息输出到文件,而标准错则会输出到屏幕。

    对于printf函数,其为标准输出,printf("xxxx")等效于fprintf(stdout, "xxxx");
    展开全文
  • 一、标准输出+标准错误输出标准输出和标准错误,同时保存到文件logfile方法一: &lt;command&gt; 2&gt;&amp;1 | tee &lt;logfile&gt;[root@home root]# id das 2&gt;&amp;1 |tee ...
  • 标准输入,标准输出和标准错误

    千次阅读 2019-03-19 17:48:04
    当我们使用文件描述符进行操作时,需要操作标准输入、标准输出、标准错误,可以包含如下头文件: #include <unistd.h> 这个头文件中定义了标准设备: /* Standard file descriptors. */ #define STDIN_FILENO...
  • 什么是标准输入、标准输出(stdin、stdout)?

    千次阅读 多人点赞 2019-06-12 10:49:23
    原文地址:什么是标准输入、标准输出(stdin、stdout)? 要弄清什么是标准输入输出。首先需要弄懂什么是IO。 IO的I是Input的意思,O是output的意思。 意味着输入和输出。 更确切的含义是: I:从外部设备输入到内存 O:...
  • linux的标准输入输出

    千次阅读 2018-08-29 02:53:26
    最前面的三个文件描述符(0,1,2)分别与标准输入(stdin),标准输出(stdout)和标准错误(stderr)对应 文件描述符 缩写 描述 0 STDIN 标准输入 1 STDOUT 标准输出 2 STDERR 标准错误输...
  • 标准输入、标准输出究竟是什么? .

    千次阅读 2012-02-18 12:44:40
    本文将从基本原理解析标准输入,标准输出的由来(最终结论见最后). 对于一个运行的程序,不可避免地要进行某些输入输出操作,也即I/O操作.对于I/O操 作,C语言提供了一系列标准I/O函数,来完成输入输出任务. 最主要的...
  • Linux shell的标准输入、输出和错误

    万次阅读 2013-08-19 20:42:04
    1.文件描述符 在linux shell执行命令时,每个进程都和三个打开的文件相联系,并使用文件描述符来引用这些文件。...输出文件—标准输出 1(缺省是屏幕,为1时是文件) 错误输出文件—标准错误
  • 再来看看 >& 操作符: 重定向操作符 ...将命令输出写入到文件或设备(如打印机),而不是命令提示符窗口或句柄。...将命令输出添加到文件末尾而不删除文件中已有的信息。...将一个句柄的输出写入到另一个句柄的输入
  • 文件IO---标准输入、标准输出和标准错误 (1) 每个进程都会默认打开3个文件描述符,即0、1、2。其中0代表标准输入流、1代表标准输出流、2代表标准错误流。通常标准输入流对应着键盘的设备文件、标准输出流和...
  • C++的输入和输出与标准输出

    万次阅读 2014-10-06 14:06:44
    第二十讲: C++的输入和输出与标准输出流 本讲基本要求  * 掌握:输入输出的含意;文件流以及输入/输出的格式控制;标准输出在C++程序中的应用。  * 理解:C++类库中的常用流类。  * 了解:C++的I/O对C的...
  • 文本流 文件用于数据的存储,相当于一个个存储数据的房子。我们之前说,所谓的数据是0或者1的序列,但严格来说,Linux以字节(byte)来作为数据的单位,也就是说这个序列每八位(bit)为一个单位(八位二进制对应的十...
  • 标准输出,标准错误输出

    千次阅读 2013-07-16 10:22:23
    标准输出,标准错误输出以及重定向输出。  (2012-07-24 14:12:46) 转载▼ 标签:  杂谈      Linux Shell 环境中支持输入输出重定向,用符号""来表示。0、1和2分别表示...
  • 2) 标准输出 stdout 代码为1,使用> 或 >> ,这里把1给省略了, 3) 标准错误输出 stderr代码为2,使用 2> 或2>> 其中:标准输出指的是『命令运行所回传的正确的信息』,而标准错误输出可理解为『命令运行失败...
  • C++的输入和输出与标准输出

    千次阅读 2016-09-20 11:23:35
    一、 C++ 输入输出的含义  以前所用到的输入和输出,都是以终端为对象的,即从键盘输入数据,运行结果输出到显示器屏幕上。从操作系统的角度看,每一个与主机相连的输入输出设备都被看作一个文件。程序的输入指的...
  • UNIX用户已经对标准输入、标准输出和标准错误的概念熟悉了。这一节是为其它不熟悉的人准备的。 标准输出和标准错误(通常缩写为 stdout 和 stderr)是建立在每个UNIX系统内的管道(pipe)。当你 print 某东西时,...
  • 基于流的操作最终会调用read或者write函数进行I/O操作。为了使程序的运行效率最高,流对象通常会提供缓冲区,以减少调用系统I/O库函数的次数。 基于流的I/O提供以下3种缓冲: 全缓冲:直到缓冲区被填满,才调用...
  • 无论是用什麽语言开发的程序,都会处理外部的输入,然后将运算结果输出到指定的位置。在交互式的程序中,输入来自用户的键盘和鼠标,结果输出到用户的屏幕,甚至到其他播放设备中。而对于某些后台运行的程序,输入...

空空如也

1 2 3 4 5 ... 20
收藏数 1,156,579
精华内容 462,631
关键字:

标准输出