将所有 tmux 回滚写入文件

Dav*_*ver 286 tmux

如何将 tmux 会话中的所有回滚写入文件?

capture-panel 可以抓取当前屏幕,但不能抓取整个回滚。

小智 426

对于那些寻找简单答案的人:

  1. 使用prefix+ :,然后输入capture-pane -S -3000+ Return。(替换-3000为您想要保存的-任意多行,或替换为所有行。)这会将这些行复制到缓冲区中。
  2. 然后,要将缓冲区保存到文件,只需再次使用prefix+:并输入save-buffer filename.txt+ return

(默认PrefixCtrl+ B。)

  • `save-buffer filename.txt` 似乎将文件保存在 `/` 中,而不是在 `pwd`(当前目录)中。相反,我提供了一个绝对文件路径,它就像一个魅力 (32认同)
  • 并且不要忘记<<amount-of-buffer-lines-you-want-to-save>>前面的减号 (23认同)
  • +n>1 登录投票后,看来这至少是第二次这个答案对我有帮助。XD (6认同)
  • 只需注意,这种获取窗格内容的方式会根据窗格的当前大小换行,而使用复制模式交互式拉动缓冲区会保留终端输出中的原始换行符。这是一个非常重要的区别。 (4认同)
  • 您可以通过 prefix+: 执行的任何操作,也可以作为 `tmux` 二进制文件的命令参数来执行。所以,任何时候回答者给你一个提示,比如“capture-pane”,搜索“man tmux”。然后你会发现 `-p` 打印到标准输出。那么你可以推断出最简单的解决方案是`tmux capture-pane -pS -1000000 >transcript.txt`。我教过你钓鱼。将此用于 tmux 的所有内容。 (3认同)
  • @MohamedEzz 对我来说,`save-buffer filename.txt` 保存到主目录。 (2认同)
  • 请注意,该文件保存在运行 tmux 的服务器上,而不是窗格中的服务器上。这可能是显而易见的,但我花了 5 分钟才理解这一点。 (2认同)

Chr*_*sen 180

tmux 1.5 中,该capture-pane命令接受-S-E指定捕获的开始和结束行;负值可用于指定历史记录中的行。将数据放入缓冲区后,您可以使用save-buffer.

这是一个示例绑定(适用于.tmux.conf),它用输入文件名的提示将其全部包装起来:

bind-key P command-prompt -p 'save history to filename:' -I '~/tmux.history' 'capture-pane -S -32768 ; save-buffer %1 ; delete-buffer'
Run Code Online (Sandbox Code Playgroud)

这将捕获(最多)32768 行历史记录加上当前显示的行。从tmux 1.6开始,如果您的窗格的历史记录超过 32Ki 行(通常最多 2Gi 行),您可以使用低至 INT_MIN 的数字。从tmux 2.0开始,您可以使用capture-pane -S -来表示“从历史的开头开始”(即没有大的、硬编码的负数)。


注意:保存的文件中的行数并不总是等于窗格的历史限制加上其高度。

当窗格的历史缓冲区已满时,tmux会丢弃最旧的 10% 的行,而不是仅丢弃一行。这意味着窗格的有效历史深度有时会低至其配置限制的 90%。

  • 是否可以自动生成 tmux 缓冲区文件的文件名而不是提示?因此,您运行快捷方式的所有内容都将保存到另一个文件中,例如文件名中的当前时间。 (2认同)

jas*_*yan 69

这取决于history-limit您在您中设置的值.tmux.conf- 默认为 2000;如果您希望捕获更多,则需要明确设置行数。

要捕获整个回滚,请进入复制模式,选择整个回滚,并将其拖入缓冲区,然后将其粘贴到您的文件中。

您如何完成此操作取决于mode-keys您喜欢的选项,vi 或 emacs。man tmux有一个有用的表格描述相应的键。

我有以下内容.tmux.conf来简化这个:

unbind [
bind Escape copy-mode
unbind p
bind p paste-buffer
bind-key -t vi-copy 'v' begin-selection
bind-key -t vi-copy 'y' copy-selection
Run Code Online (Sandbox Code Playgroud)

捕获完整回滚的过程是:

PrefixEsc : 进入复制模式

v : 开始视觉选择(假设您已经在屏幕底部)

gg : 捕获回滚中的所有内容

y : 将其拉入缓冲区

Prefixc : 打开另一个 tmux 窗口

vim scrollback.txt
Run Code Online (Sandbox Code Playgroud)

i : 在vim中进入插入模式

Prefixp : 粘贴到文件中

这里还有一个答案,描述了如何使用xsel可能有用的方法将缓冲区复制到临时文件

  • 如果在 vim 中使用 `:set paste`,vim 将忽略添加自动缩进或任何基于插入的键绑定。 (22认同)
  • 这充其量是有问题的……在 Vim 中粘贴到插入模式有各种各样的问题,例如当您启用自动缩进时。我从来没有让这个工作令我满意。 (4认同)

Chr*_*oba 59

如果您想要可以从命令行运行的东西(而不是使用 tmux 前缀键),请尝试运行:

tmux capture-pane -pS -1000000
Run Code Online (Sandbox Code Playgroud)

如果您运行它并且它似乎没有做任何事情,那是因为它输出的内容与您屏幕上的内容完全相同,所以它看起来是一样的。

当然,您也可以将其通过管道传输到文件中:

tmux capture-pane -pS -1000000 > file.out
Run Code Online (Sandbox Code Playgroud)

请参阅tmux手册页并搜索capture-pane您可以执行的更多操作(例如捕获转义序列以防您想保留颜色,或指定是否要在不包含新行的情况下连接多个可视行)

  • 啊,也很有用:使用 `-J` 以便在转储到文件时删除缓冲区中的自动换行,需要注意的是训练空格,因此 `sed` 可以提供帮助。完整命令:`tmux capture-pane -p -J -S- | sed -E 's# +$##g' > /tmp/output.txt` (5认同)
  • 在我的 tmux (2.6-3ubuntu0.2) 上,您可以使用 `-S-` 来捕获所有可用的历史记录:`tmux capture-pane -p -S- > /tmp/output.txt`。一手资料(我认为):https://man7.org/linux/man-pages/man1/tmux.1.html#COMMANDS,“-S 和 -E 指定开始和结束行号 [... ] '-' 到 -S 是历史的开始” (3认同)
  • 如果您不在本地控制台中,这将不起作用,所以我尝试如下:1)在本地 shell 中 2)下面添加一个水平窗格,`tmux capture-pane -t {top} - pS -1000 > ~/tmp.out` (2认同)

小智 25

我有标准的键绑定,它似乎与@jasonwryan 的回答有点不同,并且没有更改配置中的任何内容。

以下是对我有用的食谱。如果您不想在 tmux 配置中进行任何更改并且只想快速复制一些回滚,也许您会发现它很有用。

Prefix==Ctrl+b在我的 tmux(tmux 1.6,debian 7)中。

  1. 进入选择模式:Prefix+ [
  2. 开始选择:Space
  3. 使用 vim 导航突出显示必要的文本(例如,使用箭头键或按下gg以到达输出历史的开头)。
  4. 实际上使用Enter. 您将从复制模式退出。
  5. 使用 vim 打开任何文件(可能在新的 tmux 选项卡上)并粘贴您在使用Prefix+之前复制的内容]
  6. 然后您可以执行该文件的 cat 或使用您需要的输出。


小智 16

这是一个启用此功能的 tmux 插件:

https://github.com/tmux-plugins/tmux-logging

安装后,保存整个回滚prefix + alt-shift-p


小智 11

将所有回滚写入 tmux 中:

\n
tmux capture-pane -pS - > file\n
Run Code Online (Sandbox Code Playgroud)\n

其中\xe2\x80\x98-\xe2\x80\x99 to -S is the start of the history,如手册所述。

\n

对于会话中的所有窗格,您可以使用以下命令循环遍历所有窗格tmux list-panes -s ...

\n
\n

如何指定目标窗格?

\n
tmux capture-pane -t :WINDOW.PANE -pS - > file\n
Run Code Online (Sandbox Code Playgroud)\n

用于-t指定目标窗格。格式为SESSION:WINDOW.PANE. 例如,-t :1.2表示当前 tmux 会话、窗口 1、窗格 2。

\n

要标识窗格,请使用prefix q,它会打印当前窗口的每个窗格的 ID。

\n


Wan*_*ang 8

这实际上非常容易。按prefix key然后进入命令模式:。然后做capture-pane -S -<line number you want to dump> 然后save-buffer <filepath>

该文件包含所有回滚输出。出于安全原因,您应该在之后删除缓冲区。


小智 6

如何将 tmux 会话中的所有回滚写入文件?

我在~/.tmux.conf 中使用它,现在当我退出正在运行的 shell 时,窗格输出将保存到唯一的日志文件中:

set -g remain-on-exit
set-hook pane-died 'capture-pane -S - -E - ; save-buffer "$HOME/logs/tmux/tmux-saved.#{host_short}-#{session_id}:#{window_id}:#{pane_id}-#{pane_pid}-#{client_activity}.log"; delete-buffer; kill-pane'                        
Run Code Online (Sandbox Code Playgroud)


Cir*_*郝海东 6

转储到文件并自动打开该文件vim

这很甜蜜:

bind-key v 'capture-pane' \; \
  capture-pane -S - \; \
  save-buffer /tmp/tmux \; \
  delete-buffer \; \
  send-keys Escape 'ddivim /tmp/tmux' Enter
Run Code Online (Sandbox Code Playgroud)

此解决方案假设您的 shell处于 vi 模式,因此:

  • Escape 进入正常模式
  • dd清除任何现有命令
  • i进入插入模式
  • 然后我们跑vim /tmp/tmux

在 tmux 3.0 中测试。

关于终端换行问题的换行符插入

这样做的一个问题是,如果输出行比终端宽度长,它会在由于终端换行而被破坏的任何行上插入文字换行符。而我们通常不希望这样。

我尝试-J 按照此处提到的方式修复此问题,但这导致了另一个问题,它开始向每行添加尾随空格字符。

Eric Cousineau 提出了一个解决方法sed,但我真的宁愿避免这种情况,因为它会删除命令发出的实际换行符,而我希望在那里。

在以下位置询问了与此相反的问题: https: //github.com/tmux/tmux/issues/422添加 capture-pane 选项以仅保留尾随空格。也许空间变薄是一个基本的终端限制?

  • +1很好的答案,但是将回滚写入“/tmp”中的文件看起来是一个坏主意,因为其他人获得了读取它的权限!此外,如果人们只是想用 Vim 的全部功能来回滚,并且实际上不想将其保留在污染文件系统的文件中,那么可以在 Vim 将其内容放入缓冲区后立即删除该文件。例如,这就是我所做的:`bind v capture-pane -S - \; 保存缓冲区 ~/.x \; 删除缓冲区\; 新窗口 'vim "set buftype=nofile" +"!rm ~/.x" ~/.x +'`. (3认同)