一、什么是数据流重导向:

数据流重导向 (redirect) 由字面上的意思来看,好像就是将『数据传导到其他地方去』,没错~数据流重导向就是将某个命令运行后应该要出现在屏幕上的数据, 给他传输到其他的地方,例如文件或者是设备(打印机等.)

我们运行一个命令的时候,这个命令可能会由文件读入数据,经过处理之后,再将数据输出到屏幕上。 在上图当中, standard output 与 standard error output 分别代表『标准输出』与『标准错误输出』, 这两个默认都是输出到屏幕上的!那么什么是标准输出与标准错误输出呢?

①  标准输出(standard output)与标准错误输出(standard error output)

简单的说,标准输出指的是『命令运行所回传的正确的信息』,而标准错误输出可理解为『 命令运行失败后,所回传的错误信息』。

数据流重导向可以将 standard output (简称 stdout) 与 standard error output (简称 stderr) 分别传送到其他的文件或装置去,而分别传送所用的特殊字符则如下所示:

  1. 标准输入  (stdin) :代码为 0 ,使用 < 或 << ;
  2. 标准输出  (stdout):代码为 1 ,使用 > 或 >> ;
  3. 标准错误输出(stderr):代码为 2 ,使用 2> 或 2>> ;

例:通过标准输出,将输出信息输出到文件

  1. <pre name="code" class="plain">//通过此命令将 根目录下的文件信息保存到 root目录下的outfile文件,如果文件不存在,则创建
  2. //如果文件存在,则将文件清空,再写入信息 ,那么之前的信息被覆盖
  3. [root@localhost ~]# ll / > /root/outfile
  4.  
  5. //通过此命令查看/root/outfile 文件内容
  6. [root@localhost ~]# cat /root/outfile
  7. total 98
  8. dr-xr-xr-x. 2 root root 4096 Dec 17 03:42 bin
  9. dr-xr-xr-x. 5 root root 1024 Dec 15 12:25 boot
  10. drwxr-xr-x. 18 root root 3760 Dec 20 22:45 dev
  11. drwxr-xr-x. 103 root root 12288 Dec 22 03:48 etc
  12. drwxr-xr-x. 3 root root 4096 Dec 15 12:23 home
  13. dr-xr-xr-x. 10 root root 4096 Dec 15 12:20 lib
  14. dr-xr-xr-x. 9 root root 12288 Dec 17 03:42 lib64
  15. drwx------. 2 root root 16384 Dec 15 12:17 lost+found
  16. drwxr-xr-x. 2 root root 4096 Sep 23 2011 media
  17. drwxr-xr-x. 3 root root 4096 Dec 15 12:25 mnt
  18. drwxr-xr-x. 3 root root 4096 Dec 15 04:26 opt
  19. dr-xr-xr-x. 199 root root 0 Dec 21 11:33 proc
  20. dr-xr-x---. 27 root root 4096 Dec 24 01:39 root
  21. dr-xr-xr-x. 2 root root 12288 Dec 22 03:48 sbin
  22. drwxr-xr-x. 7 root root 0 Dec 21 11:33 selinux
  23. drwxr-xr-x. 2 root root 4096 Sep 23 2011 srv
  24. drwxr-xr-x. 13 root root 0 Dec 21 11:33 sys
  25. drwxrwxrwt. 34 root root 4096 Dec 23 03:39 tmp
  26. drwxr-xr-x. 16 root root 4096 Dec 21 01:23 usr
  27. drwxr-xr-x. 21 root root 4096 Dec 15 12:21 var

//与上面文件内信息对比,信息是一致的

  1. [root@localhost ~]# ll /
  2. total 98
  3. dr-xr-xr-x. 2 root root 4096 Dec 17 03:42 bin
  4. dr-xr-xr-x. 5 root root 1024 Dec 15 12:25 boot
  5. drwxr-xr-x. 18 root root 3760 Dec 20 22:45 dev
  6. drwxr-xr-x. 103 root root 12288 Dec 22 03:48 etc
  7. drwxr-xr-x. 3 root root 4096 Dec 15 12:23 home
  8. dr-xr-xr-x. 10 root root 4096 Dec 15 12:20 lib
  9. dr-xr-xr-x. 9 root root 12288 Dec 17 03:42 lib64
  10. drwx------. 2 root root 16384 Dec 15 12:17 lost+found
  11. drwxr-xr-x. 2 root root 4096 Sep 23 2011 media
  12. drwxr-xr-x. 3 root root 4096 Dec 15 12:25 mnt
  13. drwxr-xr-x. 3 root root 4096 Dec 15 04:26 opt
  14. dr-xr-xr-x. 199 root root 0 Dec 21 11:33 proc
  15. dr-xr-x---. 27 root root 4096 Dec 23 22:32 root
  16. dr-xr-xr-x. 2 root root 12288 Dec 22 03:48 sbin
  17. drwxr-xr-x. 7 root root 0 Dec 21 11:33 selinux
  18. drwxr-xr-x. 2 root root 4096 Sep 23 2011 srv
  19. drwxr-xr-x. 13 root root 0 Dec 21 11:33 sys
  20. drwxrwxrwt. 34 root root 4096 Dec 23 03:39 tmp
  21. drwxr-xr-x. 16 root root 4096 Dec 21 01:23 usr
  22. drwxr-xr-x. 21 root root 4096 Dec 15 12:21 var

  1.  

所以,使用>来输出信息到文件会覆盖之前的内容,那如果我想要将数据累加而不想要将旧的数据删除,那怎么办?利用两个大于的符号 (>>) 就好啦!以上面的范例来说,你应该要改成『
ll / >>  /root/outtfile 』即可

上面说到的是 standard output 的正确数据,那如果是 standard error output 的错误数据呢?那就通过 2> 及 2>> 来实现!同样是覆盖 (2>) 与累加 (2>>) 的特性!我们在刚刚才谈到 stdout 代码是 1 而 stderr 代码是 2 , 所以这个 2> 是很容易理解的,而如果仅存在 > 时,则代表默认的代码 1 !也就是说:

  • 1> :以覆盖的方法将『正确的数据』输出到指定的文件或装置上;
  • 1>>:以累加的方法将『正确的数据』输出到指定的文件或装置上;
  • 2> :以覆盖的方法将『错误的数据』输出到指定的文件或装置上;
  • 2>>:以累加的方法将『错误的数据』输出到指定的文件或装置上;

例:将正确信息和错误信息分别保存到不同的文件

  1. [root@localhost ~]# su - seth
  2. [seth@localhost ~]$ find /home -name .bashsc > rightfile 2> errorfile
  3. [seth@localhost ~]$ cat /home/seth/rightfile
  4. [seth@localhost ~]$ cat /home/seth/errorfile
  5. find: `/home/elgin': Permission denied

②  标准输入 (standard input): <  与  <<

『将原本需要由键盘输入的数据,改由文件内容来取代』

键盘输入示例:利用 cat命令创建一个文件

  1. [root@localhost ~]# cat > /root/catfile
  2. test
  3. test create file
  4. haha
  5. [root@localhost ~]# cat /root/catfile
  6. test
  7. test create file
  8. haha

使用标准输入取代键盘输入创建文件:

  1. [root@localhost ~]# cat > catfile < ~/.bashrc
  2. [root@localhost ~]# cat /root/catfile
  3. # .bashrc
  4.  
  5. # User specific aliases and functions
  6.  
  7. alias rm='rm -i'
  8. alias cp='cp -i'
  9. alias mv='mv -i'
  10.  
  11. # Source global definitions
  12. if [ -f /etc/bashrc ]; then
  13. . /etc/bashrc
  14. fi

上述的例子介绍了 <  号的作用,那么 << 呢

例:

  1. [root@localhost ~]# cat > catfile << "end"
  2. > this is atest
  3. > hello
  4. > how are you
  5. > end
  6. [root@localhost ~]# cat catfile
  7. this is atest
  8. hello
  9. how are you

利用 << 右侧的控制字符,我们可以终止一次输入, 而不必输入 [crtl]+d 来结束

二、命令运行的依据: ; 与 && 与 ||

在某些情况下,很多命令我想要一次输入去运行,而不想要分次运行时,该如何是好?基本上你有两个选择, 一个是通过 shell script 撰写脚本去运行,一种是通过底下的介绍来一次输入多重命令!

①  cmd;cmd

在命令与命令中间利用分号 (;) 来隔开,这样一来,分号前的命令运行完后就会立刻接着运行后面的命令了。

例:

  1. [root@www ~]# sync; sync; shutdown -h now

②  $? (命令回传值) 与 && 或 ||

命令下达情况 说明
cmd1 && cmd2 1. 若 cmd1 运行完毕且正确运行($?=0),则开始运行 cmd2。

2. 若 cmd1 运行完毕且为错误 ($?≠0),则 cmd2 不运行。
cmd1 || cmd2 1. 若 cmd1 运行完毕且正确运行($?=0),则 cmd2 不运行。

2. 若 cmd1 运行完毕且为错误 ($?≠0),则开始运行 cmd2。

例一:使用 ls 查阅目录 /tmp/abc 是否存在,若存在则用 touch 创建 /tmp/abc/hehe

  1. [root@localhost ~]# ls /tmp/abc && touch /tmp/abc/hehe
  2. ls: cannot access /tmp/abc: No such file or directory
  3. <span class="term_say">很干脆的说明找不到该目录,但并没有 touch 的错误,表示 touch 并没有运行</span> 

例二:测试 /tmp/abc 是否存在,若不存在则予以创建,若存在就不作任何事情

  1. [root@localhost ~]# ls /tmp/abc || mkdir /tmp/abc
  2. ls: cannot access /tmp/abc: No such file or directory -->确实不存在abc目录,所以执行创建
  3. [root@localhost ~]# ll /tmp/abc
  4. total 0 -->创建成功 说明 mkdir已执行

Linux数据流重定向的更多相关文章

  1. 十句话教你学会Linux数据流重定向

    1.看到重定向一下子就想起了web里面的redirect,没错,但是Linux数据流重定向的作用不是跳到另一个网页,而是用来存储重要的屏幕信息.将不必要的屏幕信息输出到文件里或者“黑洞”里.将错误信息 ...

  2. Linux 数据流重定向

    1.三种数据流重定向1)标准输入(stdin):代码为0,使用0<或0<<,其中代码0可以省略2)标准输出(stdout):代码为1,使用1>或1>>,其中代码1可 ...

  3. Linux数据流重定向与管道

    数据流重定向简单来说就是把原本应该输出到某处(比如说屏幕)的数据,重定向其输出目的地,到其他的地方(比如文件). linux中的输入与输出: 标准输入(stdin):默认从键盘输入 标准输出(stdo ...

  4. (大数据工程师学习路径)第一步 Linux 基础入门----数据流重定向

    介绍 开始对重定向这个概念感到些许陌生,但通过前面的课程中多次见过>或>>操作了,并知道他们分别是将标准输出导向一个文件或追加到一个文件中.这其实就是重定向,将原本输出到标准输出的数 ...

  5. 初窥Linux 之 数据流重定向

    一.什么是数据流重定向 在说数据流重定向之前,先来说说数据流的概念吧.数据流分为三种:标准输入(stdin),标准输出(stdout)和标准错误输出(stderr). 简单来说,标准输出指的是命令执行 ...

  6. linux(4) vi编辑/删除、复制、粘贴 /bash shell 环境变量设置/数据流重定向 | 的用法

    一.vi文字处理器1.vi与vimvi:文字处理器vim:程序开发工具2.vi介绍三种模式:一般模式(vi刚进入的,不可编辑),编辑模式(按i后,左下方是insert)和命令行模式(按esc退出,:w ...

  7. 【linux】linux的数据流重定向

    首先说一下什么是数据流重定向,所谓数据流重定向简单来说就是一个过程,这个过程捕捉一个文件,或者命令,程序,脚本,甚至脚本中的代码块(code block)的输出,然后把捕捉到的输出,作为输入发送给另外 ...

  8. 【Linux】数据流重定向

    数据流重定向(redirect)就是将某个命令执行后应该要出现在屏幕上的数据,给它传输到其他的地方,例如文件或设备(打印机之类的).这玩意在Linux的命令行模式下很重要,尤其是想要将某些数据存储下来 ...

  9. 谈谈Linux下的数据流重定向和管道命令

    一.标准输入.标准输出.错误输出概述 1.标准输入(stdin)是指令数据的输入,代码为0,使用<或者<<,默认是键盘. 2.标准输出(stdout)是指令执行成功返回的结果,代码为 ...

随机推荐

  1. centos防火墙设置

    1.查看 service iptables status 2.开关 service iptables start/stop 3.开机启动 chkconfig iptables on/off 4.编辑端 ...

  2. C++ STL之迭代器注意事项

    1.两个迭代器组成的区间是前闭后开的 2.如果迭代器的有效性,如果迭代器所指向的元素已经被删除,那么迭代器会失效 http://blog.csdn.net/hsujouchen/article/det ...

  3. Redis VS Memcached

    1. Redis & Memecached比较   内存管理 持久化 数据类型 客户端支持 并发性能 Memcached 预分配的内存池的方式 不支持持久化 支持简单的key-value存储 ...

  4. 2014年百度之星程序设计大赛 - 初赛(第一轮) hdu Grids (卡特兰数 大数除法取余 扩展gcd)

    题目链接 分析:打表以后就能发现时卡特兰数, 但是有除法取余. f[i] = f[i-1]*(4*i - 2)/(i+1); 看了一下网上的题解,照着题解写了下面的代码,不过还是不明白,为什么用扩展g ...

  5. bzoj3261: 最大异或和

    可持久化trie.又是%%%Xs酱... #include<cstdio> #include<cstring> #include<iostream> #includ ...

  6. UVa 120 Stacks of Flapjacks【构造法】

    题意:给出n张煎饼,从上到下输入,每张煎饼上面都有一个数字,厨师每次可以选择第k张煎饼,进行翻转操作,设计一种方法使得所有煎饼按照从小到大排序(最上面的煎饼最小) 首先是这个翻转的操作,如下图 如图所 ...

  7. 【C#学习笔记】读access2007

    using System; using System.Data.OleDb; namespace ConsoleApplication { class Program { static void Ma ...

  8. uestc 1725 吴神数

    // 筛选法// 先求出 sqrt(1<<31)内的素数// 然后筛选出符合要求的数// 详情见代码注释// #pragma comment(linker, "/STACK:10 ...

  9. zoj 2286 Sum of Divisors

    // f(n)表示 n的约数和 不包括自己// 给你一个m 求1 到 100万里面 f(n)<=m 的个数// 那么首先要用筛选求出所有出 f(n)// 然后就好办了 // 写好后 看见别人好快 ...

  10. zoj 2027 Travelling Fee

    // 题意 : 一个人要去旅行 给你起点和终点 求最少花费 其中花费为经过路径的总费用减去该路径的中的最大花费段// 直接搜索 稍微加了个剪枝 主要是数据规模小#include <iostrea ...