2016-06-14 87 views
1

我正在一个TeamCity的服务器上,我建立的一个命令是:管道输出到标准输出,然后命令然后可变

xcodebuild -scheme "<myscheme>" archive 

我需要检索.dSYM文件

code=$(cat <<-'CODE' 
$lines = file("php://stdin"); 
foreach($lines as $line){ 
    if(preg_match("#Touch (.*dSYM)#",$line,$m))echo "$m[1]\n"; 
} 
CODE 
) 
dsym=$(xcodebuild -scheme "<myscheme>" archive | php -r "$code") 

这将工作。不过,我的问题是,我想的xcodebuild的日志通过管道输送到stdoutphp -r "$code"

xcodebuild -scheme "<myscheme>" archive | tee >(php -r "$code" --) 

这也适用,生成日志显示,如果我改变php -r "$code" --php -r "$code" -- | cat,它记录了.dSYM文件位置。

但是,下面不工作:

xcodebuild -scheme "<myscheme>" archive | tee >(dsym=$(php -r "$code" --)) 

#this one is the closest but is the wrong way around, 
#dsym = all the output, the filename is sent to stdout 
exec 5>&1 
dsym=$(xcodebuild -scheme "<myscheme>" archive | tee >(php -r "$code" >&5)) 

而且我不能让我的头周围read -u X dsym作品或如何,就是要工作。有谁知道我怎么会去:

  • 管道全部输出到stdout
  • 管道全部输出到中间程序/脚本(grep
  • 上述中间程序/脚本输出存储到一个变量

测试:保存文件scheme.out与取代

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus nibh 
nulla, tempor nec dolor ac, eleifend imperdiet diam. Mauris tristique 
congue condimentum. Nullam commodo erat fringilla vestibulum tempus. 
Aenean mattis varius erat in venenatis. Donec eu tellus urna. Morbi 
lacinia vulputate purus, eu egestas tortor varius eget. Curabitur 
vitae commodo elit, vitae ullamcorper leo. 
Touch some_test_dsym_file.dSYM 
Nunc malesuada, nisi at ultricies lobortis, odio diam rhoncus urna, 
sed scelerisque enim ipsum eget quam. Nunc ut iaculis sem. Pellentesque 
massa odio, sodales nec lacinia nec, rutrum eu neque. Aenean quis neque 
magna. Nam quis dictum quam. Proin ut libero tortor. Class aptent taciti 
sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. 
Vivamus vehicula fringilla consequat. Curabitur tincidunt est sed magna 
congue tristique. Maecenas aliquam nibh eget pellentesque pellentesque. 
Quisque gravida cursus neque sed interdum. Proin ornare dapibus 
dignissim. 

所需的输出

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus nibh 
nulla, tempor nec dolor ac, eleifend imperdiet diam. Mauris tristique 
congue condimentum. Nullam commodo erat fringilla vestibulum tempus. 
Aenean mattis varius erat in venenatis. Donec eu tellus urna. Morbi 
lacinia vulputate purus, eu egestas tortor varius eget. Curabitur 
vitae commodo elit, vitae ullamcorper leo. 
Touch some_test_dsym_file.dSYM 
Nunc malesuada, nisi at ultricies lobortis, odio diam rhoncus urna, 
sed scelerisque enim ipsum eget quam. Nunc ut iaculis sem. Pellentesque 
massa odio, sodales nec lacinia nec, rutrum eu neque. Aenean quis neque 
magna. Nam quis dictum quam. Proin ut libero tortor. Class aptent taciti 
sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. 
Vivamus vehicula fringilla consequat. Curabitur tincidunt est sed magna 
congue tristique. Maecenas aliquam nibh eget pellentesque pellentesque. 
Quisque gravida cursus neque sed interdum. Proin ornare dapibus 
dignissim. 

echo $dsym

some_test_dsym_file.dSYM 
+0

要注意:因为xcodebuild联编往往挂起,如果任何错误发生了,我不能存储xcodebuild'的'输出,我需要输出到显示在苍蝇 – Isaac

回答

1

您的代码所需的输出有很大的依赖性。我会说明我认为你需要的东西,而不使用标准unix工具以外的任何东西。

这将运行一个命令,seq 4,并发送所有其输出到标准输出,并且也发送所有其输出到另一个命令,sed 's/3/3-processed/',其输出在一个变量中被捕获,var

$ exec 3>&1 
$ var=$(seq 4 | tee >(cat >&3) | sed 's/3/3-processed/') 
1 
2 
3 
4 

为了说明,我们成功地捕获的sed命令的输出:

$ echo "$var" 
1 
2 
3-processed 
4 

说明:var=$(...)捕获文件句柄1(stdout)的输出并将其分配给var。因此,为了使输出也出现在stdout上,我们需要将stdout复制到另一个文件句柄,然后$(...)重定向它。因此,我们使用exec将stdout复制为文件句柄3.这样,tee >(cat >&3)将命令的输出既发送到原始标准输出(现在称为3),也发送到文件句柄1,后者在流水线中的下一个阶段传递。

因此,使用你的工具链,尝试:

exec 5>&1 
dsym=$(xcodebuild -scheme "<myscheme>" archive | tee >(cat >&5) | php -r "$code") 
+1

我太亲近了......我认为我的脑袋混乱了文件描述符重定向。谢谢! – Isaac

相关问题