shell里的/dev/null 2>&1详解

shell中可能经常能看到:>/dev/null 2>&1

命令的结果可以通过%>的形式来定义输出

分解这个组合:“>/dev/null 2>&1” 为五部分。

1:> 代表重定向到哪里,例如:echo "123" > /home/123.txt
2:/dev/null 代表空设备文件
3:2> 表示stderr标准错误
4:& 表示等同于的意思,2>&1,表示2的输出重定向等同于1
5:1 表示stdout标准输出,系统默认值是1,所以">/dev/null"等同于 "1>/dev/null"

因此,>/dev/null 2>&1
也可以写成“1> /dev/null 2> &1”

那么本文标题的语句执行过程为:
1>/dev/null :首先表示标准输出重定向到空设备文件,也就是不输出任何信息到终端,说白了就是不显示任何信息。
2>&1 :接着,标准错误输出重定向 到 标准输出,因为之前标准输出已经重定向到了空设备文件,所以标准错误输出也重定向到空设备文件。

最常用的方式有:
    
command > file 2>file  与command > file 2>&1

它们有什么不同的地方吗?
      首先command > file 2>file 的意思是将命令所产生的标准输出信息,和错误的输出信息送到file 中.command  > file 2>file 这样的写法,stdout和stderr都直接送到file中, file会被打开两次,这样stdout和stderr会互相覆盖,这样写相当使用了FD1和FD2两个同时去抢占file 的管道。
      而command >file 2>&1 这条命令就将stdout直接送向file, stderr 继承了FD1管道后,再被送往file,此时,file 只被打开了一次,也只使用了一个管道FD1,它包括了stdout和stderr的内容。
      从IO效率上,前一条命令的效率要比后面一条的命令效率要低,所以在编写shell脚本的时候,较多的时候我们会command > file 2>&1 这样的写法。
 

标签: linux, NULL, shell, 定向

mysql纵表查询遇到的一个问题

A表:
CREATE   TABLE   `a`   (
    `aid`   int(11)   NOT   NULL,
    `astate`   int(1)   NOT   NULL
)   ENGINE=InnoDB   DEFAULT   CHARSET=utf8;

INSERT   INTO   `a`   (`aid`,   `astate`)   VALUES
(1,   1),
(2,   1),
(3,   1);


B表:
CREATE   TABLE   `b`   (
    `bid`   int(11)   NOT   NULL,
    `bfield`   varchar(255)   NOT   NULL
)   ENGINE=InnoDB   DEFAULT   CHARSET=utf8;

INSERT   INTO   `b`   (`bid`,   `bfield`)   VALUES
(1,   'f1 '),
(2,   'f2 '),
(3,   'f3 '),
(4,   'f4 ');


C表:
CREATE   TABLE   `c`   (
    `cid`   int(11)   NOT   NULL,
    `aid`   int(11)   NOT   NULL,
    `bid`   int(11)   NOT   NULL,
    `cvalue`   varchar(255)   NOT   NULL
)   ENGINE=InnoDB   DEFAULT   CHARSET=utf8;

INSERT   INTO   `c`   (`cid`,   `aid`,   `bid`,   `cvalue`)   VALUES
(1,   1,   1,   'v11 '),
(2,   1,   2,   'v12 '),
(3,   1,   3,   'v13 '),
(4,   2,   1,   'v21 '),
(5,   2,   2,   'v22 '),
(6,   3,   1,   'v31 ');

我现在的mysql语句:
SELECT   a.aid,   b.bid,   b.bfield,   cvalue
FROM   a  
LEFT   JOIN   (b,   c)  
ON   (a.aid   =   c.aid   AND   b.bid   =   c.bid)  
ORDER   BY   a.aid   ASC,   b.bid   ASC

得到的结果是:
aid   bid   bfield   cvalue
1       1       f1             v11
1       2       f2             v12
1       3       f3             v13
2       1       f1             v21
2       2       f2             v22
3       1       f1             v31

然后希望得出来的数据结构是:
aid   bid   bfield   cvalue
1       1       f1             v11
1       2       f2             v12
1       3       f3             v13
1       4       f4             null
2       1       f1             v21
2       2       f2             v22
2       3       f3             null
2       4       f4             null
3       1       f1             v31
3       2       f2             null
3       3       f3             null
3       4       f4             null

 

在csdn开三贴,最后总算得到想要的答案!

WWWWA的回答:

SELECT aa.aid,aa.bid,aa.bfield,c.cvalue FROM (
SELECT * FROM a,b
ORDER BY a.aid,bid) aa
LEFT JOIN c ON aa.bid=c.bid AND aa.aid=c.aid

 

ACMAIN_CHM的回答:

mysql> select a.aid,b.bid,b.bfield,c.cvalue

-> from (a , b) left join c on a.aid=c.aid and b.bid=c.bid

-> order by 1,2;

+-----+-----+--------+--------+

| aid | bid | bfield | cvalue |

+-----+-----+--------+--------+

| 1 | 1 | f1 | v11 |

| 1 | 2 | f2 | v12 |

| 1 | 3 | f3 | v13 |

| 1 | 4 | f4 | NULL |

| 2 | 1 | f1 | v21 |

| 2 | 2 | f2 | v22 |

| 2 | 3 | f3 | NULL |

| 2 | 4 | f4 | NULL |

| 3 | 1 | f1 | v31 |

| 3 | 2 | f2 | NULL |

| 3 | 3 | f3 | NULL |

| 3 | 4 | f4 | NULL |

+-----+-----+--------+--------+

12 rows in set (0.01 sec)

mysql>

标签: Aid, bid, NULL, NOT, int