如何在 `tput smcup` 之后保留/恢复 stderr

如何在 `tput smcup` 之后保留/恢复 stderr

给出以下人为示例,其目的是仅删除子命令的/dev/tty

result="$(
  tput smcup > /dev/tty
  tput cup 0 0 > /dev/tty
  echo 'meh' > /dev/tty
  echo 'nay' > /dev/stderr
  echo 'yay' > /dev/stdout
  tput rmcup > /dev/tty
)"; echo "result=[$result]"

它输出:

result=[yay]

但是,stderrnay不再保留在显示中。如何确保 stderr 保持显示?这样输出就是:

nay
result=[yay]

真正的用例是子命令询问用户一系列问题并计算发送到 stdout 的响应,如果发生错误,则将错误发送到 stderr。子命令完成后,其目的是擦除问题交互、存储标准输出以及显示任何标准错误。

答案1

如果你写信给标准错误该值未捕获到变量中。此行为是设计使然。如果您想保留nay其中一个,则需要将其写入标准输出或者你需要重新打开标准错误作为标准输出(这几乎是同一件事)。

为了减少混淆,此行为与tput smcupterminfo 特征无关。

此外,放入的唯一值$result将是写入的输出标准输出。所有其他输出将立即写入终端。该段本来可以更直接地写成这样:

result='yay'

tput smcup
tput cup 0 0
echo 'meh'
echo 'nay'
tput rmcup

echo "result=[$result]"

相关内容