我在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
通过管道传输到stdout
ANDphp -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
工作原理或工作原理。有谁知道我会怎么做:
grep
)测试:保存文件scheme.out
并替换xcodebuild...
为cat 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
您的代码有很多依赖性。我将在不使用标准unix工具的情况下说明您的需求。
这将运行命令,seq 4
并将其所有输出发送到stdout,还将其所有输出发送到另一个命令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)
既将命令的输出发送到原始stdout(现在称为3
),也将文件的句柄发送给1
在管道的下一阶段传递的文件句柄。
因此,使用您的工具链,尝试:
exec 5>&1
dsym=$(xcodebuild -scheme "<myscheme>" archive | tee >(cat >&5) | php -r "$code")
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句