【发布时间】:2014-03-12 20:55:33
【问题描述】:
我正在尝试在 Bash 脚本中使用 tput,并尽最大努力避免出现随机错误。为此,我写了以下行:
COLS="$(tput cols 2> /dev/null)"
令我惊讶的是,当我运行它时,COLS 始终设置为80,无论我的终端窗口的宽度是多少。 (为了演示,我的终端恰好有 115 列宽。)为了弄清楚发生了什么,我在命令行上尝试了一些操作:
$ tput cols
115
$ tput cols | cat
115
$ echo "$(tput cols)"
115
$ tput cols 2> /dev/null
115
$ echo "$(tput cols 2> /dev/null)"
80
因此,tput 似乎在其 stderr 被重定向或嵌入进程替换时成功地确定了终端特征,但不是两者兼而有之。多么奇怪!
我在 Linux 和 OS X 上都对此进行了测试,结果是一样的。
这里发生了什么?实际上,让tput 工作同时抑制stderr spew 的最佳方法是什么?
注意:我知道$COLUMNS。我对使用tput 特别感兴趣。
【问题讨论】:
-
zsh、dash和ksh中的行为相同,因此这似乎与用于运行tput的 shell 无关。
标签: bash io-redirection