给出以下人为示例,其目的是仅删除子命令的/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 smcup
terminfo 特征无关。
此外,放入的唯一值$result
将是写入的输出标准输出。所有其他输出将立即写入终端。该段本来可以更直接地写成这样:
result='yay'
tput smcup
tput cup 0 0
echo 'meh'
echo 'nay'
tput rmcup
echo "result=[$result]"