【问题标题】:How to determine the number of columns in a UNIX shell如何确定 UNIX shell 中的列数
【发布时间】:2020-03-26 00:17:35
【问题描述】:

我想为我的 sh/bash 脚本确定窗口中的列数。我现在使用tput cols,但我发现在某些平台(Synology)上tput 库不可用。

我知道这有一个 C 库,但二进制文件不是一个选项。

Python3 是一个选项,但我在帮助文件中没有找到任何内容...

tput cols 的替代品,如果可能的话......

【问题讨论】:

  • 可以为特定 UNIX shell 编写答案,还是需要对所有这些shell 都有效?
  • 也就是说,sh/bash 很像说C/C++ -- shbash 是两种不同的语言;它们不是相互兼容的。 (bash 主要是 POSIX sh 规范的超集,但有一些地方即使在兼容模式下也违反了 POSIX sh 规范,并且正式不是有效的 sh 实现。
  • 如果它适用于 python3 也适用的所有 sh-shell,那就太好了。
  • Python 甚至可以在根本没有安装 shell 的系统上工作。 :)——但我同意你的观点;这意味着简单的答案(涉及 SIGWINCH 在 bash 上更新 shell 变量 COLUMNS)不可用。
  • 好的,Charles,但是你如何找出 Python 中的列数呢?

标签: python shell terminal


【解决方案1】:

正确的方法:Python 标准库

Python 3 支持shutil.get_terminal_size(),如果没有从导出COLUMNSLINES 的shell 调用Python,它本身会回退到os.get_terminal_size()(就像bash 那样,在附加了TTY 的交互模式下运行时)。


不太正确:从 Python 中询问一个 Shell

如果您想通过 shell 获取此信息,一些 shell(包括 bash)将以交互模式公开它。以下(虽然缺乏足够的错误处理)展示了这一点:

#!/usr/bin/env python3
import subprocess, sys
p = subprocess.Popen(['bash', '-i'],
                     stdin=subprocess.PIPE,
                     stdout=subprocess.PIPE,
                     stderr=sys.stderr)
out = p.communicate(b'''printf '%s\n' "$COLUMNS" "$LINES"''')[0]
cols, lines = out.split(b'\n')[:2]
print("Cols: {}; lines: {}".format(int(cols), int(lines)))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-30
    • 2018-11-21
    • 2010-10-29
    • 2016-05-27
    • 2017-02-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多