命令重定向, 就是将目前得到的数据转移到指定的地方.分为以下几种:

>
>>
1>
2>
1>>
2>>
<

1. > 与 >>
先看一个简单的例子. 如果执行ll指令, 会在屏幕上显示执行结果:

[root@localhost yuechaotian]# pwd
/home/yuechaotian
[root@localhost yuechaotian]# ll
总用量 52
-r--------  1 root        root           22  9月  4 16:31 adsl帐号.txt
-rw-rw-r--  1 yuechaotian yuechaotian     2 12月 14 10:54 r.log
-rw-rw-r--  1 yuechaotian yuechaotian     0 12月 14 10:20 r.log.r
-rw-rw-r--  1 yuechaotian yuechaotian    24 12月 14 10:20 r.log.w
drwx--x--x  3 root        root         4096 12月  7 14:52 study
drwxrwxrwx  2 yuechaotian yuechaotian  4096 12月 14 10:58 test
-rw-------  1 root        root         5789 12月 12 20:53 tnsnames.ora
-r--------  1 root        root        22528  8月 31 10:26 房屋租赁合同.doc
[root@localhost yuechaotian]# ll test/
总用量 0

如果不想在屏幕上显示, 而是想把输出结果直接存储在指定的文件中, 可以使用 > 或 >>

# > 将输出结果以"覆盖"的形式存储在指定的文件中, 若文件不存在则自动创建.
[root@localhost yuechaotian]# ll > test/ll.log
[root@localhost yuechaotian]# cat test/ll.log
总用量 52
-r--------  1 root        root           22  9月  4 16:31 adsl帐号.txt
-rw-rw-r--  1 yuechaotian yuechaotian     2 12月 14 10:54 r.log
-rw-rw-r--  1 yuechaotian yuechaotian     0 12月 14 10:20 r.log.r
-rw-rw-r--  1 yuechaotian yuechaotian    24 12月 14 10:20 r.log.w
drwx--x--x  3 root        root         4096 12月  7 14:52 study
drwxrwxrwx  2 yuechaotian yuechaotian  4096 12月 14 11:01 test
-rw-------  1 root        root         5789 12月 12 20:53 tnsnames.ora
-r--------  1 root        root        22528  8月 31 10:26 房屋租赁合同.doc
# >> 将输出结果以“追加”的形式存储在指定的文件中, 若文件不存在则自动创建。
[root@localhost yuechaotian]# ll test/ >> test/ll.log
[root@localhost yuechaotian]# cat test/ll.log
总用量 52
-r--------  1 root        root           22  9月  4 16:31 adsl帐号.txt
-rw-rw-r--  1 yuechaotian yuechaotian     2 12月 14 10:54 r.log
-rw-rw-r--  1 yuechaotian yuechaotian     0 12月 14 10:20 r.log.r
-rw-rw-r--  1 yuechaotian yuechaotian    24 12月 14 10:20 r.log.w
drwx--x--x  3 root        root         4096 12月  7 14:52 study
drwxrwxrwx  2 yuechaotian yuechaotian  4096 12月 14 11:01 test
-rw-------  1 root        root         5789 12月 12 20:53 tnsnames.ora
-r--------  1 root        root        22528  8月 31 10:26 房屋租赁合同.doc
总用量 4
-rw-r--r--  1 root root 569 12月 14 11:01 ll.log

那么如果指令执行失败呢? 输出结果就不会保存到指定文件中:

[root@localhost yuechaotian]# ll testx > test/ll.log.2
ls: testx: 没有那个文件或目录
[root@localhost yuechaotian]# ll test/
总用量 4
-rw-r--r--  1 root root 631 12月 14 11:03 ll.log
-rw-r--r--  1 root root   0 12月 14 11:08 ll.log.2
[root@localhost yuechaotian]# cat test/ll.log.2
[root@localhost yuechaotian]#

2. 1> 2>
如果需要将输出的正确结果保存到一个文件中, 输出的错误结果保存到另一个文件中,可以借助 1> 和 2>

[root@localhost yuechaotian]# ll testx/ 1> test/ll.right 2> test/ll.wrong
[root@localhost yuechaotian]# ll test/
总用量 8
-rw-r--r--  1 root root 631 12月 14 11:03 ll.log
-rw-r--r--  1 root root   0 12月 14 11:08 ll.log.2
-rw-r--r--  1 root root   0 12月 14 11:11 ll.right
-rw-r--r--  1 root root  40 12月 14 11:11 ll.wrong
[root@localhost yuechaotian]# cat test/ll.right
[root@localhost yuechaotian]# cat test/ll.wrong
ls: testx/: 没有那个文件或目录

Linux是通过什么来判断的呢?因为每个当前指令的执行结果都保存在环境变量“?”中,当指令执行成功时 ?=0,当指令执行失败时 ?=1。Linux就是通过它来判断输出结果保存到哪个文件中的:

[root@localhost yuechaotian]# ll test/
总用量 8
-rw-r--r--  1 root root 631 12月 14 11:03 ll.log
-rw-r--r--  1 root root   0 12月 14 11:08 ll.log.2
-rw-r--r--  1 root root   0 12月 14 11:11 ll.right
-rw-r--r--  1 root root  40 12月 14 11:11 ll.wrong
[root@localhost yuechaotian]# echo $?
0
[root@localhost yuechaotian]# ll testx/
ls: testx/: 没有那个文件或目录
[root@localhost yuechaotian]# echo $?
1

如果想不论指令执行正确与否,都将结果输出到同一个指定文件中,需要借助 1> 和 2>&1:

[root@localhost yuechaotian]# ll testx/ 1> test/ll.all 2>&1
[root@localhost yuechaotian]# cat test/ll.all
ls: testx/: 没有那个文件或目录

如果可以提前预知错误的结果,只想保存正确的输出结果,而删除掉错误的结果,有什么好办法么?可以将错误的输出直接保存到“垃圾筒”中,这就借助到一个设备 /dev/null

[root@localhost yuechaotian]#ll testx/ 1> test/ll.right.only 2>/dev/null

3. 1>> 2>>
同样地,如果想将正确的输出结果追加到一个文件中,错误的输出结果追加到另一个文件中,就需要借助 1>> 和 2>> 了。它们的使用方法跟 1> 2> 类似,所不同的就是执行结果是追加到指定文件中,而不是覆盖。

[root@localhost test]# cat ll.wrong
ls: testx/: 没有那个文件或目录
[root@localhost test]# cat ll.right
[root@localhost test]# cd subtest 1>> ll.right 2>> ll.wrong
[root@localhost test]# cat ll.right
[root@localhost test]# cat ll.wrong
ls: testx/: 没有那个文件或目录
-bash: cd: subtest: 没有那个文件或目录
[root@localhost test]# ll ../ 1>> ll.right 2>> ll.wrong
[root@localhost test]# cat ll.right
总用量 60
-r--------  1 root        root           22  9月  4 16:31 adsl帐号.txt
-rw-r--r--  1 root        root           62 12月 14 11:02 ll.log
-rw-rw-r--  1 yuechaotian yuechaotian     2 12月 14 10:54 r.log
-rw-rw-r--  1 yuechaotian yuechaotian     0 12月 14 10:20 r.log.r
-rw-rw-r--  1 yuechaotian yuechaotian    24 12月 14 10:20 r.log.w
-rw-r--r--  1 root        root            6 12月 14 11:06 s.log
drwx--x--x  3 root        root         4096 12月  7 14:52 study
drwxrwxrwx  2 yuechaotian yuechaotian  4096 12月 14 11:20 test
-rw-------  1 root        root         5789 12月 12 20:53 tnsnames.ora
-r--------  1 root        root        22528  8月 31 10:26 房屋租赁合同.doc
[root@localhost test]# cat ll.wrong
ls: testx/: 没有那个文件或目录
-bash: cd: subtest: 没有那个文件或目录

4. 1> 2>> 与 1>> 2>
如果想将正确的输出和错误的输出都“追加”到同一个文件中,怎么办?你想试试 1>> 和 2>>&1 吗:

[root@localhost test]# rm *
[root@localhost test]# echo "right and wrong" 1>> ll.r 2>>&1
-bash: syntax error near unexpected token `&'
[root@localhost test]# ll
总用量 0

是的,没有 2>>&1 这个语法,但有 2>&1 这个语法,把 1>> 和 2>&1 接合起来看呢:

[root@localhost test]# echo "right and wrong" 1>> ll.r 2>&1
[root@localhost test]# ll
总用量 4
-rw-r--r--  1 root root 16 12月 14 11:39 ll.r
[root@localhost test]# cat ll.r
right and wrong
[root@localhost test]# echo "right and wrong2" 1>> ll.r 2>&1
[root@localhost test]# cat ll.r
right and wrong
right and wrong2
[root@localhost test]# ll "right and wrong2" 1>> ll.r 2>&1
[root@localhost test]# cat ll.r
right and wrong
right and wrong2
ls: right and wrong2: 没有那个文件或目录

我们看,使用 1>> 和 2>&1 达到了目的。那就是说 1> 和 2>,1>> 和 2>> 并不是配对的关系,他们之间应该是可以交叉使用的。下面测试一下:

[root@localhost test]# pwd
/home/yuechaotian/test
[root@localhost test]# rm *
# 1. 输出正确则“追加”,输出错误则“覆盖”
[root@localhost test]# echo "right_append & wrong_cover" 1>> ll.r 2> ll.w
[root@localhost test]# cat ll.r
right_append & wrong_cover
[root@localhost test]# cat ll.w
[root@localhost test]# echo "right_append & wrong_cover2" 1>> ll.r 2> ll.w
[root@localhost test]# cat ll.r
right_append & wrong_cover
right_append & wrong_cover2
[root@localhost test]# cat ll.w
[root@localhost test]# cd "right_append & wrong_cover2" 1>> ll.r 2> ll.w
[root@localhost test]# cat ll.r
right_append & wrong_cover
right_append & wrong_cover2
[root@localhost test]# cat ll.w
-bash: cd: right_append & wrong_cover2: 没有那个文件或目录
[root@localhost test]# cd "right_append & wrong_cover" 1>> ll.r 2> ll.w
[root@localhost test]# cat ll.r
right_append & wrong_cover
right_append & wrong_cover2
[root@localhost test]# cat ll.w
-bash: cd: right_append & wrong_cover: 没有那个文件或目录
#2. 输出正确则“覆盖”,输出错误则“追加”
[root@localhost test]# echo "right_cover & wrong_append" 1> ll.r 2>> ll.w
[root@localhost test]# cat ll.r
right_cover & wrong_append
[root@localhost test]# cat ll.w
-bash: cd: right_append & wrong_cover: 没有那个文件或目录
[root@localhost test]# cd "right_cover & wrong_append" 1> ll.r 2>> ll.w
[root@localhost test]# cat ll.r
[root@localhost test]# cat ll.w
-bash: cd: right_append & wrong_cover: 没有那个文件或目录
-bash: cd: right_cover & wrong_append: 没有那个文件或目录

一个小问题:如果输出正确则“追加”,输出错误则直接删除。怎么实现?

现在有两种方法了:1>>
2>> /dev/null 和 1>>
2>/dev/null。其实“追加”到垃圾筒与“覆盖”到垃圾筒效果是一样的。设备/dev/null就象一个无底洞,扔进去的东西瞬间就消失了。同样地,也可以将错误的输出保存起来,而将正确的输出“扔”到垃圾筒中。

5. <
< 的作用,就是将原本应该由键盘输入的数据经由文件读入。比如发送邮件,可以使用键盘输入邮件内容,也可以使用 < 将保存在磁盘中的文件读出,并发送出去

# 1. 使用键盘输入方式来发送邮件给yuechaotian
[root@localhost test]# mail -s "hi, yuechaotian" yuechaotian
Hi, I'm root.
.
Cc:
[root@localhost test]# su - yuechaotian
[yuechaotian@localhost ~]$
[yuechaotian@localhost ~]$ procmail -v
procmail v3.22 2001/09/10
    Copyright (c) 1990-2001, Stephen R. van den Berg   
    Copyright (c) 1997-2001, Philip A. Guenther

Submit questions/answers to the procmail-related mailinglist by sending to:

And of course, subscription and information requests for this list to:

Locking strategies:     dotlocking, fcntl()
Default rcfile:         $HOME/.procmailrc
        It may be writable by your primary group
Your system mailbox:    /var/mail/yuechaotian
[yuechaotian@localhost ~]$ cat /var/mail/yuechaotian
From root@localhost.localdomain  Sun Dec 14 12:10:08 2008
Return-Path:
Received: from localhost.localdomain (localhost.localdomain [127.0.0.1])
        by localhost.localdomain (8.13.1/8.13.1) with ESMTP id mBE4A8U0001330
        for ; Sun, 14 Dec 2008 12:10:08 +0800Received: (from root@localhost)
        by localhost.localdomain (8.13.1/8.13.1/Submit) id mBE4A86X001329
        for yuechaotian; Sun, 14 Dec 2008 12:10:08 +0800
Date: Sun, 14 Dec 2008 12:10:08 +0800
From: root
Message-Id: <200812140410.mBE4A86X001329@localhost.localdomain>
To: yuechaotian@localhost.localdomain
Subject: hi, yuechaotian

Hi, I'm root.
# 2. 那好,现在我将邮件内容保存到 mail.txt 中,使用 < 将 mail.txt 中的内容重新发送给yuechaotian
[yuechaotian@localhost ~]$ su - root
Password:
[root@localhost ~]# cd /home/yuechaotian/
[root@localhost yuechaotian]# touch mail.txt
[root@localhost yuechaotian]# echo > mail.txt "Hi, I'm root, I send this mail by using <."
[root@localhost yuechaotian]# cat mail.txt
Hi, I'm root, I send this mail by using <.
[root@localhost yuechaotian]# mail -s "hi, yuechaotian" yuechaotian < mail.txt
[root@localhost yuechaotian]# su - yuechaotian
[yuechaotian@localhost ~]$ cat /var/mail/yuechaotian
From root@localhost.localdomain  Sun Dec 14 12:10:08 2008
Return-Path:
Received: from localhost.localdomain (localhost.localdomain [127.0.0.1])
        by localhost.localdomain (8.13.1/8.13.1) with ESMTP id mBE4A8U0001330
        for ; Sun, 14 Dec 2008 12:10:08 +0800Received: (from root@localhost)
        by localhost.localdomain (8.13.1/8.13.1/Submit) id mBE4A86X001329
        for yuechaotian; Sun, 14 Dec 2008 12:10:08 +0800
Date: Sun, 14 Dec 2008 12:10:08 +0800
From: root
Message-Id: <200812140410.mBE4A86X001329@localhost.localdomain>
To: yuechaotian@localhost.localdomain
Subject: hi, yuechaotian

Hi, I'm root.

From root@localhost.localdomain  Sun Dec 14 12:33:12 2008
Return-Path:
Received: from localhost.localdomain (localhost.localdomain [127.0.0.1])
        by localhost.localdomain (8.13.1/8.13.1) with ESMTP id mBE4XCun024530
        for ; Sun, 14 Dec 2008 12:33:12 +0800Received: (from root@localhost)
        by localhost.localdomain (8.13.1/8.13.1/Submit) id mBE4XChc024529
        for yuechaotian; Sun, 14 Dec 2008 12:33:12 +0800
Date: Sun, 14 Dec 2008 12:33:12 +0800
From: root
Message-Id: <200812140433.mBE4XChc024529@localhost.localdomain>
To: yuechaotian@localhost.localdomain
Subject: hi, yuechaotian

Hi, I'm root, I send this mail by using <.

[yuechaotian@localhost ~]$

6. 何时使用命令重定向

 *当屏幕输出的信息很重要,我们需要将它保存起来时;
 *背景执行中的程序,不希望它干扰屏幕正常的输出结果时;
 *一些系统的例行性命令(比如写在/etc/crontab中的文件)的执行结果,希望它可以保存下来时;
 *一些执行命令,我们已经知道可能的错误信息,所以想以 2> /dev/null 将它丢掉时;
 *错误信息与正确欣喜需要分别输出时;
 *其它需要使用命令重定向的情况时。

Linux - 命令重定向的更多相关文章

  1. linux命令重定向>、>>、 1>、 2>、 1>>、 2>>、 <

    重定向命令其实用得不少吧,只是重来都没有仔细看过,这波正好又用到 又有空总结一波. 先看>和>>: 他们俩其实唯一的区别就是>是重定向到一个文件,>>是追加内容到文 ...

  2. linux命令重定向>、>>、 1>、 2>、 1>>、 2>>、 <(转)

    原文章地址:https://www.cnblogs.com/piperck/p/6219330.html >和>>: 他们俩其实唯一的区别就是>是重定向到一个文件,>&g ...

  3. LINUX常用命令--重定向、管道篇(四)

    一.Linux重定向 重定向能够实现Linux命令的输入输出与文件之间重定向,以及实现将多个命令组合起来实现更加强大的命令.这部分涉及到的比较多的命令主要有: 涉及到的比较多的命令主要有: cat:连 ...

  4. Linux输入输出重定向和文件查找值grep命令

    Linux输入输出重定向和文件查找值grep命令 一.文件描述符Linux 的shell命令,可以通过文件描述符来引用一些文件,通常使用到的文件描述符为0,1,2.Linux系统实际上有12个文件描述 ...

  5. linux 命令 htop & 重定向 top, bashrc文件

    最近在用linux服务器跑程序,有几条linux命令还蛮重要的,总结一下: 1. 直接跑代码: python test.py 2. 若想程序在后台跑,即使本地和服务器断开也能运行: nohup pyt ...

  6. Linux命令之文件重定向2

    linux中重定向用符号“>”表示,语法一般是 源文件 > 目标文件 1)创出.txt文件touch 1.txt 注意:创建文件夹用mkdir 2)向.txt文件中写入内容 注意:①cat ...

  7. Linux命令- echo、grep 、重定向、1>&2、2>&1的介绍

    最近笔试遇到一道题,关于Linux命令的,题目如下 下面两条命令分别会有怎样的输出 echo  hello 1>&2 |grep aaa echo  hello 2>&1 ...

  8. Linux入门之常用命令(6)Bash命令重定向 管线命令

    命令重定向 将目前所得数据转移到其他地方 >  将输出结果导入文件 如  ls -l / >test     (1)若test文件不存在则创建 (2)若test文件存在 清空后写入 > ...

  9. Linux实战教学笔记04:Linux命令基础

    第四节:Linux命令基础 标签(空格分隔):Linux实战教学笔记 第1章 认识操作环境 root:当前登陆的用户名 @分隔符 chensiqi:主机名 -:当前路径位置 用户的提示符 1.1 Li ...

随机推荐

  1. 面经:Bloomberg Internship第一轮

    上来先问了一个系统设计的问题,一个front end, 一个back end. front end有很多UI,一个UI对10个多customers,back end有许多processor,或者pro ...

  2. 剑指offer3

    输入一个链表,从尾到头打印链表每个节点的值. 思路:首先借助一个栈,遍历链表中的每一个值,然后存储到栈中,利用栈的先进后出特点,然后添加到数组中返回. package demo3; import ja ...

  3. SQL Server 将查询结果导出插入(insert)语句的简单方式

    转自 http://blog.csdn.net/danny_style/article/details/45166391 1.首先将查询结果添加到一个原数据库中不存在的表,表名随意命名. 例:SELE ...

  4. MyBatis学习笔记(六)——调用存储过程

    转自孤傲苍狼的博客:http://www.cnblogs.com/xdp-gacl/p/4270352.html 一.提出需求 查询得到男性或女性的数量, 如果传入的是0就女性否则是男性 二.准备数据 ...

  5. java模拟表单上传文件,java通过模拟post方式提交表单实现图片上传功能实例

    java模拟表单上传文件,java通过模拟post方式提交表单实现图片上传功能实例HttpClient 测试类,提供get post方法实例 package com.zdz.httpclient; i ...

  6. python之路----包

    包 包是一种通过使用‘.模块名’来组织python模块名称空间的方式. 1. 无论是import形式还是from...import形式,凡是在导入语句中(而不是在使用时)遇到带点的,都要第一时间提高警 ...

  7. iOS原生的AVFoundation扫描二维码/条形码

    #import <AVFoundation/AVFoundation.h> @interface ViewController ()<AVCaptureMetadataOutputO ...

  8. 计算概论(A)/基础编程练习1(8题)/4:求一元二次方程的根

    #include<stdio.h> #include<math.h> int main() { // 待解方程数目 int n; scanf("%d", & ...

  9. tomcat热启动没问题, 访问项目报500解决办法

    新建maven项目 添加热启动 启动访问项目报错 报错提示 解决办法 思路:包冲突 在pom.xml中添加servlet <dependency> <groupId>javax ...

  10. Java 多线程中的任务分解机制-ForkJoinPool,以及CompletableFuture

    ForkJoinPool的优势在于,可以充分利用多cpu,多核cpu的优势,把一个任务拆分成多个“小任务”,把多个“小任务”放到多个处理器核心上并行执行:当多个“小任务”执行完成之后,再将这些执行结果 ...