当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 7 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : 帮忙解释下,这个没看懂 那个 >(xxxx > xxx2) 是意味着什么
帖子发表于 : 2013-02-07 22:29 

注册: 2009-08-29 10:57
帖子: 177
送出感谢: 16
接收感谢: 3
代码:
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) 是意味着什么


_________________
还活着


页首
 用户资料  
 
2 楼 
 文章标题 : Re: 帮忙解释下,这个没看懂 那个 >(xxxx > xxx2) 是意味着什么
帖子发表于 : 2013-02-07 23:22 

注册: 2012-12-16 15:43
帖子: 2090
系统: debian
送出感谢: 8
接收感谢: 28
这是重定向,原本输出到屏幕的可以输出到一个文本文件,这样方便查看 :em11


页首
 用户资料  
 
3 楼 
 文章标题 : Re: 帮忙解释下,这个没看懂 那个 >(xxxx > xxx2) 是意味着什么
帖子发表于 : 2013-02-07 23:33 
头像

注册: 2013-02-07 11:36
帖子: 74
系统: debian wheezy
送出感谢: 5
接收感谢: 2
">"以及“>>”在linux中代表数据流重导向,区别是前者会覆盖,后者只是增加。举例说明:
“ls”命令可以显示文件夹下的内容到屏幕,那如果我想让这些内容储存在一个文件里面怎么办?可以使用数据流重导向:
代码:
ls > ls.log
然后你会发现屏幕什么都没有显示,而在你使用ls命令的目录下多了个ls.log文件,打开后可以发现本来应该显示到屏幕上的内容被导进这个文件里了。顺便说下">>":
使用以下命令(暂时不要改动ls.log内容)
代码:
ls >> ls.log
,你会发现ls.log里面又多了一份和刚才相同的内容。然后再
代码:
ls > ls.log
,会在ls.log里出现3份文件列表内容吗?no,只有一份,这就是覆盖。。。瞭?


页首
 用户资料  
 
4 楼 
 文章标题 : Re: 帮忙解释下,这个没看懂 那个 >(xxxx > xxx2) 是意味着什么
帖子发表于 : 2013-02-08 10:33 
头像

注册: 2011-05-15 1:01
帖子: 301
系统: Debian GNU/Linux sid
送出感谢: 1
接收感谢: 17
个人理解,>(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 就简单多了。


页首
 用户资料  
 
5 楼 
 文章标题 : Re: 帮忙解释下,这个没看懂 那个 >(xxxx > xxx2) 是意味着什么
帖子发表于 : 2013-02-08 13:55 
头像

注册: 2013-02-07 11:36
帖子: 74
系统: debian wheezy
送出感谢: 5
接收感谢: 2
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)会继续执行!!


页首
 用户资料  
 
6 楼 
 文章标题 : Re: 帮忙解释下,这个没看懂 那个 >(xxxx > xxx2) 是意味着什么
帖子发表于 : 2013-02-08 17:36 
头像

注册: 2011-05-15 1:01
帖子: 301
系统: Debian GNU/Linux sid
送出感谢: 1
接收感谢: 17
原来是进程替换这种东西,看来自己乱猜是不行的。 :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


页首
 用户资料  
 
7 楼 
 文章标题 : Re: 帮忙解释下,这个没看懂 那个 >(xxxx > xxx2) 是意味着什么
帖子发表于 : 2013-02-08 20:34 
头像

注册: 2013-02-07 11:36
帖子: 74
系统: debian wheezy
送出感谢: 5
接收感谢: 2
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


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 7 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 5 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译