Linux系统管理:输入输出重定向

重定向

什么是重定向:

## 标准的输入设备默认指的是键盘,标准的输出设备默认指的是显示器。

  #- 输入重定向:指定设备(通常是文件或命令的执行结果)来代替键盘作为新的输入设备;
  #- 输出重定向:将原本要输出在屏幕上的结果放到指定的设备(通常是文件)

为何用(重定向的作用)

1.当屏幕输出的信息很重要,而且希望保存重要的信息备份
2.不干扰屏幕的使用 ping baidu
3.储存错误/报错日志
4.定时任务的运行结果
5.执行一个命令,把报错信息丢弃到/dev/null
5.执行一个命令,可能报错和正确的输出并存,类似错误日志与标准正确日志需要分别输出至不同的文件。

输入和输出

执行一个shell程序时通常会自动打开三个文件描述符

名称文件描述符
标准输入(stdin)0键盘,也可以是其他文件或者命令的输出的内容可以作为标准输入
标准输出(stdout)1默认输出到屏幕
错误输出(stderr)2默认输出到屏幕
文件名称(filename)3+

进程将从标准输入中得到数据,将正常输出打印至屏幕终端,将错误的输出信息也打印至屏幕终端。

进程使用文件描述符(file descriptors)来管理打开的文件

图片[1]-Linux系统管理:输入输出重定向-不念博客

以cat命令为例, cat命令的功能是从命令行给出的文件中读取数据,并将这些数据直接送到标准输出。

直接用cat:
# cat /etc/passwd    
会把/etc/passwd的内容依次显示到屏幕上


# cat       cat命令行中没有参数, 它就会从标准输入中读取数据, 并将其送到标准输出。
hello       按enter后用户输入的每一行都立刻被cat命令输出到屏幕上。
hello

输出重定向

符号格式作用
命令> /1>文件标准输出重定向(覆盖) 将命令执行的结果放到文件中,不显示在屏幕上,覆盖文件内容
命令>>文件标准输出重定向(追加) 将命令执行的结果输出到指定的文件中,不会覆盖,如果该文件已包含数据,新数据将写入到原有内容的后面。
命令2>文件错误输出重定向(覆盖) 将原本要显示在屏幕的报错内容放入指定文件,会先清空文件,再覆盖原有内容
命令2>>文件错误输出重定向(追加) 将原本要显示在屏幕的报错内容追加到指定文件

例1 标准输出重定向(覆盖)

[root@localhost ~]# ifconfig eth0 > abc   (会自动创建文件abc)
[root@localhost ~]# cat abc
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
      inet 10.0.0.251 netmask 255.255.255.0 broadcast 10.0.0.255
      inet6 fe80::9bc0:f459:3a67:bd7a prefixlen 64 scopeid 0x20<link>
      inet6 fe80::152f:f2c7:21b3:412b prefixlen 64 scopeid 0x20<link>
      inet6 fe80::e1af:89d9:4338:31df prefixlen 64 scopeid 0x20<link>
      ether 00:0c:29:c3:b0:5d txqueuelen 1000 (Ethernet)
      RX packets 2812 bytes 244635 (238.9 KiB)
      RX errors 0 dropped 0 overruns 0 frame 0
      TX packets 1879 bytes 363592 (355.0 KiB)
      TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

例2 标准输出重定向(追加)

[root@localhost ~]# echo "This is network conf" >> if (没有自动创建了if文件)
[root@localhost ~]# cat if
This is network conf


[root@localhost ~]# echo 111 >> if
[root@localhost ~]# cat if
This is network conf
111

例3 错误输出重定向

[root@localhost ~]# su - xxx
[xxx@localhost ~]$ find /etc -name "*.conf"           (标准输出和错误全部显示在屏幕上)
[xxx@localhost ~]$ find /etc -name "*.conf" 1>a 2>b   (标准输出进文件a,错误进b)
[xxx@localhost ~]$ cat b
find: ‘/etc/grub.d’: Permission denied
find: ‘/etc/polkit-1/rules.d’: Permission denied
find: ‘/etc/polkit-1/localauthority’: Permission denied
find: ‘/etc/pki/CA/private’: Permission denied
find: ‘/etc/pki/rsyslog’: Permission denied
......(省略)


&符
[zls@zls ~]$ find /etc -name "*.conf" &>ab     (全进文件ab)


[root@localhost ~]# crontab -e     编辑定时任务


# 在里面输入:
* * * * * /usr/sbin/ntpdate time1.aliyun.com &>/dev/null

输入重定向

输入重定向,即原本从键盘等设备上获得的输入信息,重定向由命令的输出作为输入。

命令 < 文件               将指定文件作为命令的输入设备
命令 << 分界符         表示从标准输入设备(键盘)中读入,直到遇到分界符才停止(读入的数据不包括分界符)
命令 < 文件1 > 文件2     将文件1作为命令的输入设备,该命令的执行结果输出到文件2 中。

例1

[root@localhost ~]# cat /etc/passwd
[root@localhost ~]# cat < /etc/passwd      输出结果同上面命令相同


[root@localhost ~]# grep 'root'            等待输入
cch
kjnj
[root@localhost ~]# grep 'root' < /etc/passwd    输入设备变为/etc/passwd
root:x:0:0:root:/root:/bin/bash

例2

[root@localhost ~]# cat a.txt
[root@localhost ~]# cat < /etc/passwd > a.txt
[root@localhost ~]# cat a.txt                 输出了和 /etc/passwd 文件内容相同的数据

自己操作试验:

[root@localhost ~]# vim 2.txt     新建一个2.txt 输入:“不管是昨天的风”
[root@localhost ~]# cat > 2.txt   需要按ctrl D结束输入
woshii^Hnnibaba
babab
[root@localhost ~]# cat 2.txt     发现被覆盖了
woshinnibaba
babab


[root@localhost ~]# cat > 2.txt < A   按A结束输入 一个<不行
bash: A: No such file or directory
[root@localhost ~]# cat > 2.txt << A      
> hahahahah
> A


[root@localhost ~]# cat >> 2.txt << A   >>追加,不覆盖
> hohouhhh
> A
[root@localhost ~]# cat 2.txt
hahahahah
hohouhhh
© 版权声明
THE END