一:管道命令与重定向区别
1.左边的命令应该有标准输出 | 右边的命令应该接受标准输入
左边的命令应该有标准输出 > 右边只能是文件
左边的命令应该需要标准输入 < 右边只能是文件
2.管道触发两个子进程执行”|”两边的程序;而重定向是在一个进程内执行
二:举个栗子
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 |
【提醒注意】:
一般如果是命令间传递参数,建议用管道,如果处理输出结果需要重定向到文件,建议用重定向输出。
订阅
微信搜索“毕小烦”或者扫描下面的二维码,即可订阅我的文章。
如果文章对你有帮助,请随手点个赞吧!
(完)