管道输出到stdout然后命令然后变量

时间:2016-06-14 00:13:48

标签: bash unix pipe xcodebuild tee

我正在使用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并将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

1 个答案:

答案 0 :(得分:1)

您的代码有很多依赖项。我将在不使用标准unix工具之外的任何内容的情况下说明我认为您需要的内容。

它运行一个命令seq 4,并将其所有输出发送到stdout,并将其所有输出发送到另一个命令sed 's/3/3-processed/',其输出在变量中捕获,{ {1}}:

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 捕获文件句柄1(stdout)的输出并将其分配给var=$(...)。因此,为了使输出也出现在stdout上,我们需要在 var重定向之前将stdout复制到另一个文件句柄。因此,我们使用$(...)将stdout复制为文件句柄3.这样,exec将命令的输出发送到原始stdout(现在称为tee >(cat >&3))和文件句柄{ {1}}在管道的下一个阶段传递。

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

3