Tput

tput ed 為空

  • December 8, 2019

的輸出tput ed是空的,我不知道為什麼。其他功能工作正常。輸出中也ed沒有失去,infocmp所以 tput 應該匹配,對吧?

$ printf '%q' "$(tput ed)"
''
$ printf '%q' "$(tput home)"
$'\033'\[H

我在 Mac OS 10.14.6 和 iTerm2 上使用 zsh。期限=xterm-256color。

更多地搜尋和搜尋文件(主要是 terminfo),我終於發現我需要回退到舊的termcap程式碼,因為所有 terminfo 功能都不支持capname 。

ed=$(tput ed || tput cd)

Apple 為 ncurses 配置了 termcap 支持(除了預設的 terminfo):

  • config.status文件顯示配置選項。
  • infocmp 呼叫_nc_read_file_entry來獲取其數據。
  • tput 呼叫setupterm,然後轉到**_nc_read_entry,呼叫_nc_read_tic_entry,呼叫_nc_read_file_entry**
  • 如果 有問題**_nc_read_tic_entry,則_nc_read_entry**回退到 termcap 支持(請參閱read_entry.c)。

由於那是十年前的程式碼,_nc_read_tic_entry 中可能存在的問題可能已經修復了一段時間。

例如,我安裝了 MacPorts,並且可以正常工作,而 Apple 的版本沒有。這是我用來調查問題的頂級腳本:

#!/bin/sh
unset TERMINFO
unset TERMINFO_DIRS
export TERM=xterm-256color
#export PATH=/usr/bin:$PATH
echo TERMCAP
infocmp -CrTt1 | grep -E ':..=.*:' | sed -e 's/^    ://' -e 's/=.*//' | xargs -n 1 /tmp/test-tput
echo TERMINFO
infocmp -1 | grep -E '^ .*=.*,' | sed -e 's/^   //' -e 's/=.*//' | xargs -n 1 /tmp/test-tput

(註釋/取消註釋PATH以在兩者之間進行選擇),並且呼叫第二個腳本**/tmp/test-tput**來顯示值:

#!/bin/bash
tput "$1" >/dev/null 2>/dev/null || exit
echo -n "CAP:$1 "
tput "$1" 2>/dev/null
echo

ncurses 5.7 中的行為是1999 年引入的錯誤

   + modify tput to accept termcap names as an alternative to terminfo
     names (patch by Jeffrey C Honig).

並於2009 年修復:

   + change order of lookup in progs/tput.c, looking for terminfo data
     first.  This fixes a confusion between termcap "sg" and terminfo
     "sgr" or "sgr0", originally from 990123 changes, but exposed by
     20091114 fixes for hashing.  With this change, only "dl" and "ed" are
     ambiguous (Mandriva #56272).

Apple 的ncurses 5.7比該修復程序早了大約一年。

引用自:https://unix.stackexchange.com/questions/552845