输出重定向 输入重定向 管道简单介绍 -20160729

输出重定向 输入重定向 管道简单介绍

标准输入和输出

我们先来了解下输入和输出的概念:

在计算机中我们了解到计算机的组成部分:其中有输入 输出设备。

 

 

 

输出重定向

对于程序来说:

程序 :指令 + 数据

对于数据来说,数据可以由我们通过键盘输入,或者程序直接使用存储设备上的数据,我们称为读入 数据,程序处理数据后需要返回一个结果,这个结果需要输出出来,我们称为输出数据。

linux系统中,打开的文件都有一个fd:file descriptor (文件描述符)

例如:我们使用 nano打开一个文件

 

#通过ps  aux 可以看到我们使用的程序 nano

root      21498  0.2  0.3 116404  3052 pts/0    S+   14:10   0:00 nano test

#查看fd的标示状态

[root@wCentos7 ~]# ll /proc/21498/fd

total 0

lrwx——. 1 root root 64 Jul 30 14:11 0 -> /dev/pts/0

lrwx——. 1 root root 64 Jul 30 14:11 1 -> /dev/pts/0

lrwx——. 1 root root 64 Jul 30 14:10 2 -> /dev/pts/0

[root@wCentos7 ~]#

Linux给程序提供三种I/O设备

标准输入(STDIN——-> 0 默认接受来自于键盘的输入

标准输出(STDOUT—–> 1 默认输出到终端窗口

标准错误(STDERR—–> 2 默认输出到终端窗口

 

我们是可以通过修改 I/O输出和输入可以 修改默认位置的,意思就是:

我们可以修改程序输入的数据可以不来至键盘;

程序的正确输出可以不输出到屏幕上;

程序的错误输出可以不输出到屏幕上。

 

把输出(正确的)和错误输出重定向到文件

语法如下: 命令 操作符号   文件名

支持的炒作符号:

> : STDOUT重定向到文件;

2> : STDERR重定向到文件;

&> : 把以上两类输出重定向到文件

注意: > :文件内容会被覆盖,不过我们也可以设置不覆盖

Set  -C  : 禁止将内容覆盖已有文件,但可以追加

Set  +C :  允许覆盖

 

>| : 强制覆盖

>> : 在原来的基础上,追加新内容,不覆盖原来的内容

 

 

举例说明:

标准输出和错误输出各自重定向到不同位置:

[root@wCentos7 ~]# ls -l /   #默认输出至屏幕上的消息
total 36 
lrwxrwxrwx.   1 root root    7 Jul 21 11:23 bin -> usr/bin
dr-xr-xr-x.   4 root root 4096 Jul 21 11:35 boot
drwxr-xr-x.  19 root root 3240 Jul 28 08:36 dev
drwxr-xr-x. 129 root root 8192 Jul 30 12:53 etc
drwxr-xr-x.   8 root root   87 Jul 30 10:44 home
lrwxrwxrwx.   1 root root    7 Jul 21 11:23 lib -> usr/lib
lrwxrwxrwx.   1 root root    9 Jul 21 11:23 lib64 -> usr/lib64
drwxr-xr-x.   2 root root    6 Aug 12  2015 media
drwxr-xr-x.   2 root root    6 Aug 12  2015 mnt
drwxr-xr-x.   3 root root   15 Jul 21 11:31 opt
dr-xr-xr-x. 447 root root    0 Jul 28 08:36 proc
dr-xr-x---.  14 root root 4096 Jul 30 10:25 root
drwxr-xr-x.  38 root root 1120 Jul 29 20:14 run
lrwxrwxrwx.   1 root root    8 Jul 21 11:23 sbin -> usr/sbin
drwxr-xr-x.   2 root root    6 Aug 12  2015 srv
dr-xr-xr-x.  13 root root    0 Jul 28 08:36 sys
drwxr-xr-x.  18 root root 4096 Jul 30 11:21 testdir
drwxrwxrwt.  23 root root 4096 Jul 30 14:28 tmp
drwxr-xr-x.  13 root root 4096 Jul 21 11:23 usr
drwxr-xr-x.  20 root root 4096 Jul 28 12:28 var

[root@wCentos7 ~]# ls -l /  >/tmp/dui.log  2>/tmp/cuowu.log
正确的重定向到 dui.log文件
错误的重定向到 cuowu.log文件
屏幕上不再显示任何的信息了
[root@wCentos7 ~]# cat /tmp/dui.log  #查看文件的内容和正确输出信息是一样的
total 36
lrwxrwxrwx.   1 root root    7 Jul 21 11:23 bin -> usr/bin
dr-xr-xr-x.   4 root root 4096 Jul 21 11:35 boot
drwxr-xr-x.  19 root root 3240 Jul 28 08:36 dev
drwxr-xr-x. 129 root root 8192 Jul 30 12:53 etc
drwxr-xr-x.   8 root root   87 Jul 30 10:44 home
lrwxrwxrwx.   1 root root    7 Jul 21 11:23 lib -> usr/lib
lrwxrwxrwx.   1 root root    9 Jul 21 11:23 lib64 -> usr/lib64
drwxr-xr-x.   2 root root    6 Aug 12  2015 media
drwxr-xr-x.   2 root root    6 Aug 12  2015 mnt
drwxr-xr-x.   3 root root   15 Jul 21 11:31 opt
dr-xr-xr-x. 448 root root    0 Jul 28 08:36 proc
dr-xr-x---.  14 root root 4096 Jul 30 10:25 root
drwxr-xr-x.  38 root root 1120 Jul 29 20:14 run
lrwxrwxrwx.   1 root root    8 Jul 21 11:23 sbin -> usr/sbin
drwxr-xr-x.   2 root root    6 Aug 12  2015 srv
dr-xr-xr-x.  13 root root    0 Jul 28 08:36 sys
drwxr-xr-x.  18 root root 4096 Jul 30 11:21 testdir
drwxrwxrwt.  23 root root 4096 Jul 30 14:31 tmp
drwxr-xr-x.  13 root root 4096 Jul 21 11:23 usr
drwxr-xr-x.  20 root root 4096 Jul 28 12:28 var

 

 

[root@wCentos7 ~]# lss -l /  #错误默认输出到屏幕上面来的
bash: lss: command not found...
Similar command is: 'ls'
[root@wCentos7 ~]# lss -l /  >/tmp/dui.log  2>/tmp/cuowu.log
[root@wCentos7 ~]# cat /tmp/cuowu.log  #重定向后,信息保存在文件中了
bash: lss: command not found...
Similar command is: 'ls'

 

对个命令的输出重定向语法:

[root@wCentos7 ~]# (cat /etc/issue; cal) > /tmp/all.txt (记得多个命令使用括号 分号隔开)
把issue的内容 和 日历的信息重定向到文件中
[root@wCentos7 ~]# cat /tmp/all.txt 
\S
Kernel \r on an \m
 
========================
welcome to my hostname SA
welcome to my hostname SB
=========================
      July 2016     
Su Mo Tu We Th Fr Sa
                1  2
 3  4  5  6  7  8  9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31

 

对有些命令不管输出的是正确的还是错误的输出我们都丢弃掉不保存任何文件也不需要输出默认输出方法:

[root@wCentos7 ~]# findsss /etc/ -name passwdbash: findsss: command not found...

#默认错误输出输出至屏幕上

 

[root@wCentos7 ~]# find /etc/ -name passwd
/etc/passwd
/etc/pam.d/passwd

#默认正确输出输出至屏幕上

 

[root@wCentos7 ~]# find /etc/ -name passwd &>/dev/null
[root@wCentos7 ~]# findsss /etc/ -name passwd &>/dev/null

#输出重定向后,不管是错误的还是正确的数据在屏幕上都不输出了

 

注意:/dev/null是一个特殊的设备,就是一个数据黑洞,吞噬送往该设备的所有数据,以后如果不想让屏幕有显示可以,会经常用到这个/dev/unll 的数据吞噬设备

 

 

输入重定向

关于输入重定向,默认情况下,有许多的指令时等待默认输入设备输入的,比如默认输入设备键盘。等待键盘输入指令有: cat   tr等等命令,我们就以实际的案例来了解输入重定向如何使用 。

正常情况下你使用cat命令不带任何参数,cat就会另起一行,你输入什么,他就输出什么,和用户就有一个交换的过程,我们如果把需要输入的数据保存在文件中,一起输入到cat中去行不行,是可以的,我们可以这样操作:

输入重定向的表示符为: <

Cat命令输入重定向:

[root@wCentos7 ~]#  cat < /etc/fstab  
               #我们使用 < 就把fatab文件中的内容输入至cat命名,cat命令在显示在标准输出上。
 
#
# /etc/fstab
# Created by anaconda on Thu Jul 21 11:22:48 2016
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=b63a2f0c-c9f9-465d-b2b5-3830fedccdd2 /                       xfs     defaults        0 0
UUID=9dec22f7-215e-4a47-97d1-ae09446d62d2 /boot                   xfs     defaults        0 0
UUID=a138a967-21db-41e0-9a4a-7a5eb4979481 /testdir                xfs     defaults        0 0
UUID=bb99272d-4848-49bd-a896-e5f843037cbf swap                    swap    defaults        0 0

tr 命令输入重定向

[root@wCentos7 yuedir]# tr "a-z"  "A-Z"  < /etc/issue  #把输入进入的数据小写字母转化为大写字母
\S
KERNEL \R ON AN \M
 
========================
WELCOME TO MY HOSTNAME SA
WELCOME TO MY HOSTNAME SB
=========================

 

管道

管道(使用符号“|”表示)用来连接命令

命令1 | 命令2 | 命令3 |

Ø将命令1STDOUT发送给命令2STDIN,命令2STDOUT发送到命令3STDIN

ØSTDERR默认不能通过管道转发,可利用2>&1 |& 实现

Ø最后一个命令会在当前shell进程的子shell进程中执行用来

Ø组合多种工具的功能

举例说明:

[root@wCentos7 yuedir]#  cat /etc/issue  | tr "a-z" "A-Z"  #小写转换为大写
\S
KERNEL \R ON AN \M
 
========================
WELCOME TO MY HOSTNAME SA
WELCOME TO MY HOSTNAME SB
=========================

 

 

[root@wCentos7 yuedir]# echo 1234567890 | passwd --stdin harry #自动修改密码
Changing password for user harry.
passwd: all authentication tokens updated successfully.
[root@wCentos7 yuedir]#

 

 

 

总结:

输入重定向与管道感觉功能上有些冲突,管道的功能更好跟强大,支持的命令比输入重定向多。

关于管道的更做的功能在实际运用中慢慢体会,比如: tr 命令 ,tee命令等等,后面介绍命令的使用可以更好的理解管道的使用。

原创文章,作者:linux_root,如若转载,请注明出处:http://www.178linux.com/27694

(0)
linux_rootlinux_root
上一篇 2016-08-04 14:42
下一篇 2016-08-04 14:42

相关推荐

  • 网络知识点

    1. 实现异地搭建局域网的方法1>. 让运行商拉专线,这是相当昂贵的。2>.  VPN (Virtual PrivateNetwork)  虚拟专用网络 2. VPN的隧道协议主要有三种:PPTP、L2TP和IPSec。其中PPTP和L2TP协议工作在OSI模型的第二层,又称为二层隧道协议;IPSec是第三层隧道协议。 2. …

    Linux干货 2016-09-01
  • 马哥教育网络班22期+第1周课程练习

    问题1: 计算机组成如下:CPU、存储器、输入设备、输出设备1、中央处理器(Central Processing Unit,简称 CPU)。它主要由控制器、运算器等组成,并采用大规模集成电路工艺制成的芯片,又称微处理器芯片。   CPU又由运算器和控制器组成。1)运算器 运算器又称算术逻辑单元(Arithmetic Logic Unit简…

    Linux干货 2016-08-15
  • 文件相关命令

    1、Linux上的文件管理类命令都有哪些,其常用的使用方法及其相关示例演示。 cp:copy 源文件:目标文件 单源复制:cp [OPTION]… [-T] SOURCE DEST 如果DEST不存在,则事先创建此文件,并复制源文件的数据流至DEST中 如果DEST存在: 如果DEST是非目录文件:则覆盖目标文件 如果DEST是目录文件:则先在D…

    Linux干货 2016-09-23
  • lvs

    1、什么是LVS LVS是Linux Virtual Server的简写,以为Linux虚拟服务器,是一个虚拟服务器集群,其具有很好的可伸缩性、可靠性、可管理性。LVS集群采用IP负载均衡技术和基于内容请求分发技术。调度器具有很好的吞吐率,将请求均衡地转移到不同的服务器上执行,且调度器自动屏蔽掉服务器的故障,从而将一组服务器构成一个高性能的、高可用的虚拟服务…

    Linux干货 2016-10-29
  • 方便实用的文件查找与压缩

    在平时的运维工作当中通常会编辑某些文件,但时间久了,突然一下子记不起文件的名字,遇到的事情又很紧急,需要立马去处理,而自己只知道那个文件部分的特征信息,我们需要在系统中去搜索自己想要的文件,那么有没有办法去实现呢,当然有,在我们的系统中,文件查找的工具有两个,locate和find。那么下面来介绍这两个工具的用法以及两个工具之间的差别。 在我们linux系统…

    Linux干货 2016-08-13
  • rsyslog将日志记录于MySQL中

    数据库服务器:CentOS7 192.168.119.159   日志:CentOS6 192.168.119.129     准备mysql数据库 和 用户账户 [root@localhost ~]# yum install mariadb-server   [root@localhost ~]# systemctl…

    2018-02-05