标准输入和输出
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