我正在尝试在脚本中获取当前终端窗口的宽度,并使用 80 作为后备以防万一。我认为这很简单:
cols=$( tput cols || echo 80 ) ; echo $cols
# -> 100
100 是正确的,我将终端设置为 100 个字符宽。由于cols
没有符合 POSIX 的参数tput
,因此并非所有系统都支持它,因此是回退。现在让我们测试回退:
cols=$( tput colsx || echo 80 ) ; echo $cols
# -> tput: unknown terminfo capability 'colsx'
# -> 80
嗯……不太好。我不想看到那个错误。它印在 上stderr
,所以让我们压制它:
cols=$( tput colsx 2>/dev/null || echo 80 ) ; echo $cols
# -> 80
是的,这样好多了。所以最终的代码是
cols=$( tput cols 2>/dev/null || echo 80 ) ; echo $cols
# -> 80
80?怎么回事?为什么它现在遇到后备?让我们试试这个:
cols=$( tput cols 2>/dev/null ) ; echo $cols
# -> 80
啊……重定向stderr
改变了输出tput
?这怎么可能?让我们确认一下:
tput cols 2>/dev/null
# -> 100
好吧,现在我迷路了!有人可以解释一下这里发生了什么吗?