eshell 与 term 获取行的长度的时候,行为不一致的问题

TERM


Eshell

但是两者的环境变量中的 COLUMNS 和 LINES 都是一致的,TERM也都是 xterm-256color, PAGER也都是 cat。到底是什么在起作用呢

主要还是 hombrew 计算错误(获取不到 eshell 缓冲区宽度)吧,brew list 在我这也只有两列。ls 命令就跟 term 下一样了。


UPDATE 2018-05-28 18.14.32

两个问题:

  • hombrew 没有导出变量 COLUMNS,所以即便额外 export COLUMNS=xxx; brew search mysql 在 homebrew 内部仍然获取不到 xxx 这个值。

  • hombrew 使用的不是 $COLUMNS 而是 Tty.width

1 个赞

谢谢,我也去读了一波源码

def width
    width = `/bin/stty size 2>/dev/null`.split[1]
    width ||= `/usr/bin/tput cols 2>/dev/null`.split[0]
    width ||= 80
    width.to_i
end

问题在于

Eshell 下 ruby -e 'puts `/bin/stty size 2>/dev/null`' 的结果是0 0


Edit: eshell 下 stty size 的结果是 0 0,可能是一个 eshell 的bug


有一个类似的问题

里面提到,直接使用 ENV['COLUMNS'] 作为 fallback 应该是合理的

我不认为是 Eshell 的 bug,因为 /usr/bin/tput cols 就能取到正确的值。

再说环境变量,不管是在 Eshell 还是其它地方直接运行 ruby:

~ $ ruby -e 'puts ENV["COLUMNS"]'
272

然而在 hombrew (formater.rb 文件 columns 方法,输出格式化就在这里) 中打印出来是空的:

puts ">>> columns: #{ENV['COLUMNS']}"

整个 ENV 遍历出来只有 homebrew 自己导出的若干个变量。

貌似把这行去掉,然后再传入 COLUMNS 就好了。Eshell 中 stty size 等不到正确结果,而 tput cols 可以,Homebrew 看起是优先使用前者。

diff --git a/Library/Homebrew/utils/tty.rb b/Library/Homebrew/utils/tty.rb
index 81d5f00d7b..d50d7c6771 100644
--- a/Library/Homebrew/utils/tty.rb
+++ b/Library/Homebrew/utils/tty.rb
@@ -6,9 +6,9 @@ module Tty
   end
 
   def width
-    width = `/bin/stty size 2>/dev/null`.split[1]
     width ||= `/usr/bin/tput cols 2>/dev/null`.split[0]
     width ||= 80
+    puts width
     width.to_i
   end
 
diff --git a/bin/brew b/bin/brew
index 4a874ab9a7..6d425af571 100755
--- a/bin/brew
+++ b/bin/brew
@@ -68,7 +68,7 @@ then
   # Filter all but the specific variables.
   for VAR in HOME SHELL PATH TERM LOGNAME USER CI TRAVIS SSH_AUTH_SOCK SUDO_ASKPASS \
              http_proxy https_proxy ftp_proxy no_proxy all_proxy HTTPS_PROXY FTP_PROXY ALL_PROXY \
-             "${!HOMEBREW_@}" "${!TRAVIS_@}"
+             "${!HOMEBREW_@}" "${!TRAVIS_@}" COLUMNS
   do
     # Skip if variable value is empty.
     [[ -z "${!VAR}" ]] && continue
2 个赞

感谢~我提了个pr,