首页 > 解决方案 > 如何同时捕获外部命令输出并将其打印到终端

问题描述

我可以从以下管道返回:

$OUTPUT = $(flutter build ios --release --no-codesign | tail -1)

我想从构建中获取最后一行并显示进度,例如

$OUTPUT = $(flutter build ios --release --no-codesign | out | tail -1)

其中假设的out实用程序还将输出发送到终端。

你知道如何?

标签: powershellterminaltee

解决方案


注意:在类Unix平台上,js2010的优雅tee /dev/tty方案是最简单的;除了在 Windows 上工作之外,以下解决方案可能对在 PowerShell 中逐行处理外部程序输出感兴趣。


PowerShell解决方案(假设您问题中的代码是 PowerShell [1]):

我不确定如何flutter报告其进度,但以下可能有效:

如果一切都进入stdout

$OUTPUT = flutter build ios --release --no-codesign | % {
  Write-Host $_ # print to host (console)
  $_  # send through pipeline
} | select -Last 1

注意:%是 的内置别名ForEach-ObjectselectSelect-Object.

如果进度消息发送到stderr

$OUTPUT = flutter build ios --release --no-codesign 2>&1 | % {
  Write-Host $_.ToString() # print to host (console)
  if ($_ -is [string]) { $_ }  # send only stdout through pipeline
} | select -Last 1

[1] 正如赋值的 LHS 中$的变量名中的符号和 ( )周围的空格所证明的那样,这两者在/ POSIX-like shells中都不会按预期工作。=
$OUTPUT = bash


推荐阅读