一:管道命令与重定向区别
1.左边的命令应该有标准输出 |右边的命令应该接受标准输入
左边的命令应该有标准输出 > 右边只能是文件
左边的命令应该需要标准输入 < 右边只能是文件
2.
管道触发两个子进程执行”|”两边的程序;而
重定向是在一个进程内执行
二:举个栗子
view
source
02 | bixiaopeng@bixiaopengtekiMacBook-Pro
~$ cat logcat.log
| grep Displayed |
03 | 05-22
23:22:57.674 I /ActivityManager (
389): Displayed com.taobao.taobao /com .taobao.tao.detail.DetailActivity:
+2s448ms |
04 | 05-22
23:25:18.385 I /ActivityManager (
389): Displayed com.android.mms/.ui.ConversationList: +1s68ms |
05 | 05-22
23:25:28.166 I /ActivityManager (
389): Displayed com.android.contacts/.activities.PeopleActivity: +1s160ms |
06 | 05-22
23:25:32.385 I /ActivityManager (
389): Displayed com.android.contacts/.activities.DialtactsActivity: +630ms |
07 | 05-22
23:27:26.955 I /ActivityManager (
389): Displayed com.android.contacts/.activities.PeopleActivity: +251ms |
08 | 05-22
23:27:31.948 I /ActivityManager (
389): Displayed com.android.mms/.ui.ConversationList: +299ms |
09 | 05-22
23:27:36.502 I /ActivityManager (
389): Displayed com.android.vending/.AssetBrowserActivity: +1s34ms |
11 | #"重定向"符号,右边只能是文件(普通文件,文件描述符,文件设备) |
12 | bixiaopeng@bixiaopengtekiMacBook-Pro
~$ grep Displayed
<logcat.log |
13 | 05-22
23:22:57.674 I /ActivityManager (
389): Displayed com.taobao.taobao /com .taobao.tao.detail.DetailActivity:
+2s448ms |
14 | 05-22
23:25:18.385 I /ActivityManager (
389): Displayed com.android.mms/.ui.ConversationList: +1s68ms |
15 | 05-22
23:25:28.166 I /ActivityManager (
389): Displayed com.android.contacts/.activities.PeopleActivity: +1s160ms |
16 | 05-22
23:25:32.385 I /ActivityManager (
389): Displayed com.android.contacts/.activities.DialtactsActivity: +630ms |
17 | 05-22
23:27:26.955 I /ActivityManager (
389): Displayed com.android.contacts/.activities.PeopleActivity: +251ms |
18 | 05-22
23:27:31.948 I /ActivityManager (
389): Displayed com.android.mms/.ui.ConversationList: +299ms |
19 | 05-22
23:27:36.502 I /ActivityManager (
389): Displayed com.android.vending/.AssetBrowserActivity: +1s34ms |
21 | #下面2个也相同,将logcat.log的内容发送到指定邮箱 |
23 | bixiaopeng@bixiaopengtekiMacBook-Pro
~$mail -s 'www.wirelessqa.com' wirelessqa.me@gmail.com
<logcat.log |
25 | bixiaopeng@bixiaopengtekiMacBook-Pro
~$ cat logcat.log
|mail -s 'www.wirelessqa.com2' wirelessqa.me@gmail.com |
28 | #把logcat.log内容重定向到
sed ,然后sed输出通过管道,输入给grep.需要将前面用"()"运算符括起来 |
29 | bixiaopeng@bixiaopengtekiMacBook-Pro
~$( sed -n '1,$p' | grep Displayed)<logcat.log |
30 | 05-22
23:22:57.674 I /ActivityManager (
389): Displayed com.taobao.taobao /com .taobao.tao.detail.DetailActivity:
+2s448ms |
31 | 05-22
23:25:18.385 I /ActivityManager (
389): Displayed com.android.mms/.ui.ConversationList: +1s68ms |
32 | 05-22
23:25:28.166 I /ActivityManager (
389): Displayed com.android.contacts/.activities.PeopleActivity: +1s160ms |
33 | 05-22
23:25:32.385 I /ActivityManager (
389): Displayed com.android.contacts/.activities.DialtactsActivity: +630ms |
34 | 05-22
23:27:26.955 I /ActivityManager (
389): Displayed com.android.contacts/.activities.PeopleActivity: +251ms |
35 | 05-22
23:27:31.948 I /ActivityManager (
389): Displayed com.android.mms/.ui.ConversationList: +299ms |
36 | 05-22
23:27:36.502 I /ActivityManager (
389): Displayed com.android.vending/.AssetBrowserActivity: +1s34ms |
37 | #效果同上面的命令:由于重定向运算符在执行前首先检查它的输入,输出,也就是0,1,2
设备是否准备好,所以优先级会最高,执行完重定向运算再执行shell命令 |
38 | bixiaopeng@bixiaopengtekiMacBook-Pro
~$ sed -n '1,$p' < logcat.log | grep Display |
39 | 05-22
23:22:57.674 I /ActivityManager (
389): Displayed com.taobao.taobao /com .taobao.tao.detail.DetailActivity:
+2s448ms |
40 | 05-22
23:25:18.385 I /ActivityManager (
389): Displayed com.android.mms/.ui.ConversationList: +1s68ms |
41 | 05-22
23:25:28.166 I /ActivityManager (
389): Displayed com.android.contacts/.activities.PeopleActivity: +1s160ms |
42 | 05-22
23:25:32.385 I /ActivityManager (
389): Displayed com.android.contacts/.activities.DialtactsActivity: +630ms |
43 | 05-22
23:27:26.955 I /ActivityManager (
389): Displayed com.android.contacts/.activities.PeopleActivity: +251ms |
44 | 05-22
23:27:31.948 I /ActivityManager (
389): Displayed com.android.mms/.ui.ConversationList: +299ms |
45 | 05-22
23:27:36.502 I /ActivityManager (
389): Displayed com.android.vending/.AssetBrowserActivity: +1s34ms |
47 | #这个grep又接受管道输入,又有cat1.log输入,那是不是2个都接收呢?刚才说了"<"运算符会优先,管道还没有发送数据前,grep绑定了cat1.log的输入,这样sed命令输出就被抛弃了。这里一定要小心使用 |
48 | bixiaopeng@bixiaopengtekiMacBook-Pro
~$ sed -n '1,10p' <logcat.log
| grep wirelessqa
<cat1.log |
53 | bixiaopeng@bixiaopengtekiMacBook-Pro
~$ cat cat1.log
>wire1.log |
54 | bixiaopeng@bixiaopengtekiMacBook-Pro
~$ cat wire1.log |
59 | #通过管道实现将结果存入文件,还需要借助命令tee,它会把管道过来标准输入写入文件wire2.log
,然后将标准输入复制到标准输出(stdout),所以重定向到/dev/null 不显示输出 |
60 | #">"输出重定向,往往在命令最右边,接收左边命令的,输出结果,重定向到指定文件。也可以用到命令中间。 |
61 | bixiaopeng@bixiaopengtekiMacBook-Pro
~$ cat cat1.log | tee wire2.log
&> /dev/null |
62 | bixiaopeng@bixiaopengtekiMacBook-Pro
~$ cat wire2.log |
65 | #目录下面有:cat4.log
和cat4.log不存在,因此将ls 命令错误输出输入到err.txt正确输出,还会通过管道发送到grep命令。 |
66 | bixiaopeng@bixiaopengtekiMacBook-Pro
~$ ls cat1.log
cat2.log cat3.log cat4.log cat5.log 2>err.log | grep 'cat' |
71 | bixiaopeng@bixiaopengtekiMacBook-Pro
~$ cat cat1.log
cat2.log cat3.log cat4.log cat5.log 2>err.log | grep 'wireless' |
77 | bixiaopeng@bixiaopengtekiMacBook-Pro
~$ ls cat1.log
cat2.log cat3.log cat4.log cat5.log &>err.log | grep 'cat' |
78 | bixiaopeng@bixiaopengtekiMacBook-Pro
~$ cat err.log |
79 | ls :
cat4.log: No such file or
directory |
80 | ls :
cat5.log: No such file or
directory |
【提醒注意】:一般如果是命令间传递参数,建议用管道,如果处理输出结果需要重定向到文件,建议用重定向输出。