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

相关推荐

  • N25期第二周作业

    1.Linux上的文件管理类命令都有哪些,其常用的使用方法及其相关示例演示 ls 列出文件和目录命令 -a:显示所有档案及目录 -A:显示除隐藏文件”.”和”..”以外的所有文件 -C:多列显示结果,默认选项 -l:单列显示结果,以长格式显示目录下的内容列表 -F:在每个输出项后追加文件的类型标识符 &#822…

    Linux干货 2016-12-11
  • wk_03作业

    1、列出当前系统上所有已经登录的用户的用户名,注意:同一个用户登录多次,则只显示一次即可。 who |cut -d' ' -f1|uniq 2、取出最后登录到当前系统的用户的相关信息。 # who |tail -1 |cut -d &#03…

    Linux干货 2016-12-15
  • 深入了解磁盘结构

    一、     linux中常见的磁盘:   无论什么操作系统,归根还是要落实与磁盘上的,对于磁盘的管理也是linux管理必备的一项技能。在linux中“一切皆文件”的思想贯彻整个linux的学习中,包括像是磁盘等的硬件也是在linux的/dev/目录下类似于文件形式的存放,常见的SATA口USB优盘或是SCS…

    Linux干货 2016-08-29
  • LVM基本应用,扩展以及缩减的实现

    这是一篇马哥课堂博客作业,这次换个表现方式写,前面先写总体的操作过程,后面显示详情 其实马哥视频讲的非常详尽,听起来特别容易理解,只是让我要写出来那得费九牛二虎之力,估计还得照着视频写。如下仅是看过视频之后的一个操作过程,比较粗糙,仅仅是作业。。。 LVM:logical volume manager version2 逻辑卷管理系统 PV:physical…

    Linux干货 2016-06-28
  • ps查看进程

    ps命令 ps [OPTION]支持三种选项UNIX选项 如-A -eBSD选项 如aGNU选项 如–help选项:默认显示当前终端中的进程a 选项包括所有终端中的进程x 选项包括不连接终端的进程u 选项显示进程所有者的信息f 选项显示进程树,相当于 –forestk|–sort 属性 对属性排序,属性前加- 表示倒序o …

    2017-12-19
  • 基于NFS服务的mariadb数据库实现

    实验要求:     (1) nfs server导出/data/目录;     (2) nfs client挂载/data/至本地的/mydata目录;本地的mysqld或mariadb服务的数据目录设置为/mydata, 要求服务能正常启动,且可正常 存储数据;   (3)用另一台主机,…

    2017-06-11