帮忙解释下,这个没看懂 那个 >(xxxx > xxx2) 是意味着什么

为当前最终发行版之前的所有版本提供支持
回复
ruandao
帖子: 177
注册时间: 2009-08-29 10:57
送出感谢: 16 次
接收感谢: 3 次

帮忙解释下,这个没看懂 那个 >(xxxx > xxx2) 是意味着什么

#1

帖子 ruandao » 2013-02-07 22:29

代码: 全选

bash在某些系统中的特性,可以将输入输出转到另一个程序中去,可以同时输出个多个程序,使用方法是>(list)或<(list),如[1]:

wget -O - http://example.com/dvd.iso \
       | tee >(sha1sum > dvd.sha1) \
             >(md5sum > dvd.md5) \
       > dvd.iso
巧妙地同时完全了SHA-1和MD5校验工作。



那个 >(xxxx > xxx2) 是意味着什么
还活着
jinjiachen
帖子: 2095
注册时间: 2012-12-16 15:43
系统: debian
送出感谢: 8 次
接收感谢: 27 次

Re: 帮忙解释下,这个没看懂 那个 >(xxxx > xxx2) 是意味着什么

#2

帖子 jinjiachen » 2013-02-07 23:22

这是重定向,原本输出到屏幕的可以输出到一个文本文件,这样方便查看 :em11
头像
艾徳庄
帖子: 74
注册时间: 2013-02-07 11:36
系统: debian wheezy
送出感谢: 5 次
接收感谢: 2 次

Re: 帮忙解释下,这个没看懂 那个 >(xxxx > xxx2) 是意味着什么

#3

帖子 艾徳庄 » 2013-02-07 23:33

">"以及“>>”在linux中代表数据流重导向,区别是前者会覆盖,后者只是增加。举例说明:
“ls”命令可以显示文件夹下的内容到屏幕,那如果我想让这些内容储存在一个文件里面怎么办?可以使用数据流重导向:

代码: 全选

ls > ls.log
然后你会发现屏幕什么都没有显示,而在你使用ls命令的目录下多了个ls.log文件,打开后可以发现本来应该显示到屏幕上的内容被导进这个文件里了。顺便说下">>":
使用以下命令(暂时不要改动ls.log内容)

代码: 全选

ls >> ls.log
,你会发现ls.log里面又多了一份和刚才相同的内容。然后再

代码: 全选

ls > ls.log
,会在ls.log里出现3份文件列表内容吗?no,只有一份,这就是覆盖。。。瞭?
头像
royclark
帖子: 301
注册时间: 2011-05-15 1:01
系统: Debian GNU/Linux sid
送出感谢: 0
接收感谢: 14 次

Re: 帮忙解释下,这个没看懂 那个 >(xxxx > xxx2) 是意味着什么

#4

帖子 royclark » 2013-02-08 10:33

个人理解,>(sha1sum > dvd.sha1) 是指下载到的 dvd.iso 传给 sha1sum 这个程序做为标准输入,sha1sum 的输出(也就是 dvd.iso 的 sha1sum 值)再重定向到 dvd.sha1,跟 | sha1sum > dvd.sha1 意思差不多,只是 | sha1sum > dvd.sha1 只能重定向给一个程序。
>(md5sum > dvd.md5) 含义类似。

原来还有这种用法,以前都不知道。 :em11

PS:话说 bash 要把标准输出重定向给多个程序可真麻烦呀,听说其他什么 shell 就简单多了。
头像
艾徳庄
帖子: 74
注册时间: 2013-02-07 11:36
系统: debian wheezy
送出感谢: 5 次
接收感谢: 2 次

Re: 帮忙解释下,这个没看懂 那个 >(xxxx > xxx2) 是意味着什么

#5

帖子 艾徳庄 » 2013-02-08 13:55

ruandao 写了:

代码: 全选

bash在某些系统中的特性,可以将输入输出转到另一个程序中去,可以同时输出个多个程序,使用方法是>(list)或<(list),如[1]:

wget -O - http://example.com/dvd.iso \
       | tee >(sha1sum > dvd.sha1) \
             >(md5sum > dvd.md5) \
       > dvd.iso
巧妙地同时完全了SHA-1和MD5校验工作。



那个 >(xxxx > xxx2) 是意味着什么
不好意思,刚发现我好像曲解楼主的意思了,刚才查了下,楼主的这个问题叫做进程替换,一般格式是

代码: 全选

>(command)
注意>与小括号之间没有空格,它的意思是此刻打开一个子shell来执行command命令,而这个子shell会接受>之前命令送进的值作为处理对象,在这个子shell执行完后会跳回到原命令继续执行。以楼主的例子来解释,楼主引用的代码可以理解为在tee > dvd.iso中间加进了两个子进程>(sha1sum > dvd.sha1) 和 >(md5sum > dvd.md5)。之所以叫做进程替换,可以这样理解:假如tee命令调用的是一个成为tee(argument)的函数,在执行这个函数的时候,插入了一个sha1sum,这时候会先执行sha1sum(argument)函数,函数的参数没有变,只是函数名被替换了。不过要注意,在执行完sha1sum(argument)之后,tee(argument)会继续执行!!
头像
royclark
帖子: 301
注册时间: 2011-05-15 1:01
系统: Debian GNU/Linux sid
送出感谢: 0
接收感谢: 14 次

Re: 帮忙解释下,这个没看懂 那个 >(xxxx > xxx2) 是意味着什么

#6

帖子 royclark » 2013-02-08 17:36

原来是进程替换这种东西,看来自己乱猜是不行的。 :em06
不过我自己查资料后觉得 5 楼的理解有点问题。
command1 <( command2 ) 应该是产生一个文件描述符 /dev/fd/n 代替原来 <( command2 ) 的位置,即相当于 command1 /dev/fd/n,该文件描述符与 command2 通过管道相连,即 command2 的标准输出与 /dev/fd/n 连接。
command1 >( command2 ) 类似,产生一个文件描述符 /dev/fd/n 代替原来 >( command2 ) 的位置,即相当于 command1 /dev/fd/n,该文件描述符与 command2 通过管道相连,即 command2 的标准输入与 /dev/fd/n 连接。
按这样的理解可以用有名管道来模拟

代码: 全选

wget -O - http://example.com/dvd.iso \
       | tee >(sha1sum > dvd.sha1) \
             >(md5sum > dvd.md5) \
       > dvd.iso
如下

代码: 全选

mkfifo pipe0
mkfifo pipe1
wget -O - http://example.com/dvd.iso | tee pipe0 pipe1 > dvd.iso
# 另开一个终端
sha1sum > dvd.sha1 < pipe0
# 再另开一个终端
md5sum > dvd.md5 < pipe1
rm pipe0 pipe1 
即 tee 按其命令的格式写 pipe* 文件,写入的内容通过管道传给 sha1sum 和 md5sum 作为标准输入。进程替换与上述模似不同的是其通过文件描述符 /dev/fd/n 来连接管道。

以上都是现学现卖,如有不对欢迎指正。 :em03
头像
艾徳庄
帖子: 74
注册时间: 2013-02-07 11:36
系统: debian wheezy
送出感谢: 5 次
接收感谢: 2 次

Re: 帮忙解释下,这个没看懂 那个 >(xxxx > xxx2) 是意味着什么

#7

帖子 艾徳庄 » 2013-02-08 20:34

royclark 写了:原来是进程替换这种东西,看来自己乱猜是不行的。 :em06
不过我自己查资料后觉得 5 楼的理解有点问题。
command1 <( command2 ) 应该是产生一个文件描述符 /dev/fd/n 代替原来 <( command2 ) 的位置,即相当于 command1 /dev/fd/n,该文件描述符与 command2 通过管道相连,即 command2 的标准输出与 /dev/fd/n 连接。
command1 >( command2 ) 类似,产生一个文件描述符 /dev/fd/n 代替原来 >( command2 ) 的位置,即相当于 command1 /dev/fd/n,该文件描述符与 command2 通过管道相连,即 command2 的标准输入与 /dev/fd/n 连接。
按这样的理解可以用有名管道来模拟

代码: 全选

wget -O - http://example.com/dvd.iso \
       | tee >(sha1sum > dvd.sha1) \
             >(md5sum > dvd.md5) \
       > dvd.iso
如下

代码: 全选

mkfifo pipe0
mkfifo pipe1
wget -O - http://example.com/dvd.iso | tee pipe0 pipe1 > dvd.iso
# 另开一个终端
sha1sum > dvd.sha1 < pipe0
# 再另开一个终端
md5sum > dvd.md5 < pipe1
rm pipe0 pipe1 
即 tee 按其命令的格式写 pipe* 文件,写入的内容通过管道传给 sha1sum 和 md5sum 作为标准输入。进程替换与上述模似不同的是其通过文件描述符 /dev/fd/n 来连接管道。

以上都是现学现卖,如有不对欢迎指正。 :em03
赞一个,讲得很到位,学习了。 :em11
回复

回到 “老旧版本支持”