输出重定向 输入重定向 管道简单介绍 -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)
上一篇 2016-08-04 14:42
下一篇 2016-08-04 14:42

相关推荐

  • linux一周学习总结

          对于linux,之前也完全没有接触过,完全零基础小白。来到马哥以后,进入学习也有一周时间 ,一周里老师带我们学习了很多指令,下面,我就自己的理解和老师讲授的内容对linux中的一些指令做一个简单的小总结。 一、关于SHELL Shell     查询当前系统使用了哪个shell   &n…

    2017-07-15
  • Linux系统启动流程

        下面按照系统的启动顺序来进行逐一的讲解。 一、POST     当我们按下开机的电源后,主板上的芯片组会首先向CPU发出一个reset指令,之后待芯片组检测到电源供电稳定后便撤去reset指令,CPU就会跳转到BIOS中的启动代码位置; BIOS首先要检测关键设备(如内显…

    Linux干货 2015-05-23
  • N25期–第十六周作业

    1源码编译安装LNMP架构环境; 2、编写一个脚本完成以下功能: (1)、一键搭建LNMP源码编译环境; (2)、可通过在脚本后面跟上一些参数来自定义安装目录等其他选项。” 1、源码编译安装LNMP架构环境; 安装编译工具和库文件 1 yum -y install gcc gcc-c++ autoconf libjpeg libjpeg-devel libp…

    Linux干货 2017-05-08
  • 马哥教育网络第21期-第六周课程练习

    请详细总结vim编辑器的使用并完成以下练习题 1、复制/etc/rc.d/rc.sysinit文件至/tmp目录,将/tmp/rc.sysinit文件中的以至少一个空白字符开头的行的行首加#; [root@6 ~]# cp /etc/rc.d/rc.sysinit /tmp [root@6 ~]# …

    Linux干货 2016-08-15
  • 基础指令使用篇 Linux版

    回显,回声 echo echo hello > /dve/pts/1 打开图形界面 init 5   关闭图形界面 init 3 ctrl+alt+F1-6字符,F7图形界面 chvt 改变虚拟终端 chvt +数字 startx  图形的软件打开 poweroff centOS 6.8与7.2都正常关闭断电 hostname 显示…

    系统运维 2016-08-04
  • Lvm基本应用,扩展及缩减实现

    什么是LVM LVM是Logical Volume Manager的简写。其是Linux环境下对磁盘分区进行管理的一种机制。LVM由Heinz Mauelshagen在Linux 2.4内核上实现。其主要作用是在不损坏磁盘数据的情况下对磁盘空间进行增加,缩减。LVM的做法是将几块物理硬盘通过软件的方式组合成一块空间相对大的Volume Group,简称VG,…

    Linux干货 2016-09-08