Bash equivalent for PowerShell's Write-Host (write to terminal but don't pipe to stdout)

Viewed 1504

In PowerShell I can do this:

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

$x = Get-Foo
Write-Host "The answer is $x" # output: The answer is 42

So Calculating result.. is output to the console, but it's not present in the pipeline so I can just take the method's "return value" and it works

However in bash I don't have Write-Host and something like this won't work:

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

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

I realize I can save to a file and print after, just wondering if there's a more elegant alternative

1 Answers

Redirect your output to /dev/tty to print directly to the terminal:

echo "Calculating result..." > /dev/tty

Simple example:

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

Another, probably better option - if you want to give the caller the option to still capture - or silence - the status information - is to redirect to stderr, with >&2:

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