PowerShell的Bash等价物';s写入主机(写入终端,但不将管道写入标准输出)

PowerShell的Bash等价物';s写入主机(写入终端,但不将管道写入标准输出),bash,powershell,pipeline,Bash,Powershell,Pipeline,在PowerShell中,我可以执行以下操作: function Get-Foo() { Write-Host "Calculating result..." return 42 } $x = Get-Foo Write-Host "The answer is $x" # output: The answer is 42 因此,计算结果..被输出到控制台,但它不在管道中,所以我可以只获取方法的“返回值”,它就工作了 但是,在bash中,我没有写主机,类似的东西也不起作用: fun

在PowerShell中,我可以执行以下操作:

function Get-Foo()
{
   Write-Host "Calculating result..."
   return 42
}

$x = Get-Foo
Write-Host "The answer is $x" # output: The answer is 42
因此,
计算结果..
被输出到控制台,但它不在管道中,所以我可以只获取方法的“返回值”,它就工作了

但是,在bash中,我没有
写主机
,类似的东西也不起作用:

function getfoo {
   echo "Calculating result..."
   echo "42"
}

x=$(getfoo)
echo $x # output will include "Calculating result..."

我意识到我可以保存到一个文件并在之后打印,只是想知道是否有更优雅的替代方法将您的输出重定向到
/dev/tty
直接打印到终端:

echo "Calculating result..." > /dev/tty
简单的例子:

# Only '42' is stored in $output
$ output=$(echo "Calculating result..." > /dev/tty; echo 42)
Calculating result...

另一个,可能更好的选项-如果您想让调用者选择仍然捕获-或静音-状态信息,则使用
&2
重定向到stderr:

# Only '42' is stored in $output
$ output=$(echo "Calculating result..." >&2; echo 42)
Calculating result...

我认为向stderr发送非错误的东西是不直观的。我喜欢重定向到
/dev/tty
。@mikemacana将状态信息输出到stderr是Unix世界的常见做法(
git
是一个突出的例子)。这并不理想,但在没有其他流可用性的情况下,它是最佳选择,因为输出到
/dev/tty
的问题在于,您既不能抑制也不能捕获此类输出。这是一个很好的反例。这仍然感觉像是bash的一个解决方案,它没有将内容与表示分离—最好使用
python
(如果他们想删除安装任何东西的要求)或者,如果他们愿意要求Unix用户安装它,请坚持使用
pwsh
。@Mikemacana传统的shell,如
bash
cmd.exe
依赖于系统级别的可用输出流,这些输出流仅限于两个输出流:stdout和stderr。因此,数据以外的任何内容都必须发送到stderr。在内部过程中,PowerShell很好地提供了六种特定用途的输出流,但在与外部世界通信时,它也必须适合这两种输出流。