答案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 标准COLUMNS
和LINES
彼此独立运行的变量不同。因此,您还必须关注 a defaultheight
,如果未设置,则为 24;如果为零,则检测强制关闭,则为 65536。
你可以,或者,保留检测并用伪终端来欺骗您的程序。
tmux
是实现这一目标的复杂方法,需要使用所有密钥填充和中间文件。使用 Bernstein ptybandage
and stty columns
(针对内部伪终端)更简单,只需一行,并在程序运行时实时输出到标准输出:
ptybandage sh -c 'stty 列 40 ;执行任务'
进一步阅读
- 丹尼尔·伯恩斯坦 (1996)。
ptybandage
。DJBwares。 - 乔纳森·德博因·波拉德 (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