6
29
2011
4

使用 zsh 的 zpty 模块

本文来自依云's Blog,转载请注明。

Zsh 的模块真多呀,最初文档时知道有 ztcp 模块时已惊叹,最近又在邮件列表看到竟然有 zpty 模块,解决了困扰我良久的一个小问题。

会往终端输出彩色字符的程序都知道,如果输出的目的地不是终端,通常彩色转义字符是不需要的,比如重定向到文件,或者通过管道传给 grep 之类的程序。所以不少程序会有个--color=WHEN选项,你可以指定是程序自己决定,还是总是要彩色或者不要彩色。Linux 总是善于提供一堆选项来满足不同的需要。可是,除此之外,ls 还会根据输出目的地是不是终端来确定要不要一行显示多个文件名。更囧的是,只有办法强制 ls 一行显示一个文件名,却没有选项强制它把管道当成终端进行多栏显示。结果就是,当文件比较多时,ls | less会一行一个文件名,即使右边还有大把的空间。强制显示彩色也需要--color=always这么长的参数(而 tree 只需要-C就可以了)。

很早就想写个程序利用专门的伪终端来给 ls 的彩色多栏输出加上翻页器了。现在我终于把它实现了,而且简单很多:

ptyrun () {
  local ptyname=pty-$$
  zmodload zsh/zpty
  zpty $ptyname ${1+"$@"}
  if [[ ! -t 1 ]]; then
    setopt local_traps
    trap '' INT
  fi
  zpty -r $ptyname
  zpty -d $ptyname
}
ptyless () {
  ptyrun $@ | less
}

另外,这个用于 yaourt 查找时也是不错的 ;-)


2014年8月22日更新:采纳评论中的建议,使用管道取代了临时文件。另外,在 Dropbox 可以下载我的 zshrc

Category: shell | Tags: zsh | Read Count: 12270
zjx 说:
Jun 30, 2011 07:20:29 AM

请问一下这个函数怎么使用?

zjx 说:
Jun 30, 2011 07:32:59 AM

了解是怎么作的了

i 说:
Aug 19, 2014 12:41:24 AM

假如,用ptyless執行某命令:

$ ptyless ll -Ria /

咱猜測這樣會花很長很長很長一段時間,然後纔能在翻頁器中顯現出來……稍微改了一下,咱覺得這樣會更好:https://wiki.archlinux.org/index.php/Core_utilities#Colored_output_when_reading_from_stdin
不過很好奇為何直接用管道會行不通……難道是zpty的bug?

Avatar_small
依云 说:
Aug 22, 2014 07:12:57 PM

非常感谢,我更新一下!


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter

| Theme: Aeros 2.0 by TheBuckmaker.com