进一步阅读

进一步阅读

我有一个我想运行的程序,欺骗它相信我的终端的列数比它少,因为这可以实现我需要的本机截断。

resize按照xterm建议尝试了在阿斯库本图然而,它只能在 xterm 中正常工作,并且很难编写脚本。我需要一些可以在脚本中使用的东西来获取输出任务战士命令。

不幸的是,导出不同的值COLUMNS似乎并没有改变任何东西。

答案1

社区的答案是在正确的轨道上。

您可以使用tmux所需的几何图形创建一个分离会话(列宽,假设一定数量的行)。

tmux new-session -d -s task-session -x WIDTH -y HEIGHT

然后运行你的命令。

tmux send-keys 'task' ENTER

不要将命令输出通过管道传输到文件。

将窗格转储tmux到文件:

tmux capture-pane -b temp-buffer -S -
tmux save-buffer -b temp-buffer output.txt
tmux delete-buffer -b temp-buffer 

参考

答案2

事实上,POSIX 标准是环境变量的值COLUMNS取代其他获取终端大小的方法。该标准将变量的用途之一描述为“在比终端或窗口任意小的区域中显示数据”,这符合您的需求。

这些其他方法没有标准化,但它们通常是针对终端设备打开文件描述符ioctl()的。TIOCGWINSZ你的程序就是这样做的;尽管它只是假设没有isatty()检查其标准输出是终端设备。

不幸的是,有些程序不尊重COLUMNS环境变量,而您的程序就是其中之一。相反,它提供了自己特殊的非标准机制,即其配置文件中的detection和设置。defaultwidth

更令人悲伤的是,这些操作与环境变量相反COLUMNS。它们是后备方案,而不是替代方案。您必须关闭detection,以便程序停止使用TIOCGWINSZ并恢复到默认状态。然后,您必须设置 的值defaultwidth,如果未设置则为 80,如果为零则强制关闭检测,值为 65536。

更令人遗憾的是,关闭detection同时适用于宽度和高度,这与 POSIX 标准COLUMNSLINES彼此独立运行的变量不同。因此,您还必须关注 a defaultheight,如果未设置,则为 24;如果为零,则检测强制关闭,则为 65536。

可以,或者,保留检测并用伪终端来欺骗您的程序。 tmux是实现这一目标的复杂方法,需要使用所有密钥填充和中间文件。使用 Bernstein ptybandageand stty columns(针对内部伪终端)更简单,只需一行,并在程序运行时实时输出到标准输出:

ptybandage sh -c 'stty 列 40 ;执行任务'

进一步阅读

  • 丹尼尔·伯恩斯坦 (1996)。ptybandageDJBwares
  • 乔纳森·德博因·波拉德 (2014)。ptybandage小吃指南。软件。

答案3

以下内容尚未起作用,但我怀疑您可以通过一些修改使其起作用。这些命令创建一个新的 tmux 会话并在执行 taskwarrior 之前修改窗格的大小:

tmux new -d -s s1
tmux split -v
tmux resize-pane -t s1 -y 5
tmux send-keys "task > output.txt" ENTER
sleep 1
tmux kill-session -t s1
cat output.txt

相关内容