标准输入和标准输出

标准输入和输出

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
  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值