在Bash中,如何在已重定向到标准输出时进行打印?

时间:2019-04-21 18:44:20

标签: bash file-descriptor io-redirection

我正在编写一个Bash函数,例如func() { … },该函数以交互方式询问用户一些问题,然后运行某个命令。

这里的奖励是上述命令的stdout,我希望用户像这样调用我的函数func >outfile,以将命令的输出捕获到文件中。

我的问题是,如何在不污染有用输出的情况下将这些交互式问题打印到stdout

换句话说:在一个函数中,如果stdout已被调用方重定向,那么我如何写到“原始” stdout(终端),暂时忽略调用方的重定向? / p>

我是否必须使用stderr获得语义上不属于那里的输出?

1 个答案:

答案 0 :(得分:2)

回答原始问题

在定义函数的时间点创建原始标准输出的备份,并且可以在调用时使用它。

exec {myfunc_stdout_fd}>&1
myfunc() {
  echo "Content sent to stdout as defined at invocation time"
  echo "Content sent to original stdout" >&"$myfunc_stdout_fd";
}

...之后:

myfunc_out=$(myfunc)

...将Content sent to stdout as defined at invocation time存储在myfunc_out中,并立即将Content sent to original stdout写入函数定义发生时定义的标准输出。

https://ideone.com/HwHRJ7的在线解释器中查看运行情况


建议:最佳实践用法

按常规,提示是在UNIX上写到stderr的,因此出于提示相关的目的,通常不要求保留原始的stdout。 read -p会在stderr上提示; bash本身会做什么(就像其他shell一样);这是适当的,因为POSIX将stderr定义为“诊断输出”的适当流,该类别包括有关程序当前正在做什么的状态(是否准备好进行更多输入,f / e)。 / p>

另请参阅: