进程完成时在tmux中发出警报

Joh*_*ohn 15 tmux

我可以设置tmux在进程完成时在非活动窗口中触发警报吗?

例如:我开始一个很长的构建过程.我希望在完成时收到通知,而不是每次打印状态时都会收到通知.

wum*_*ump 20

我很惊讶这个答案还没有给出:你可以使用tmux窗口设置visual-bell.随着bell-action然后你可以配置你是否希望看到当前窗口铃铛,或用于非当前窗口只(其他).我个人更喜欢第二个,因为你不会看到shell产生的噪音,如果它在当前窗口中,你可能不关心通知.

set-window-option -g visual-bell on
set-window-option -g bell-action other
Run Code Online (Sandbox Code Playgroud)

当进程生成铃声时,tmux将突出显示响铃铃声的窗口标题,并显示"窗口X中的铃声"通知.

然后在过程结束时响铃.例如:

make; echo -e '\a'
Run Code Online (Sandbox Code Playgroud)

(或者&& ||,;如果你想分别只在成功或失败时响铃)


Wer*_*ght 12

我知道有3个解决方案,没有一个真正理想.您可以将这些命令放入~/.tmux.conf或直接通过Ctrl-B作为Tmux命令运行它们:.

  1. 每当输出发生变化时监视并发出警报(然后您可以将输出重定向到其他位置,以便输出仅在命令完成后更改):

    :set -g visual-activity on
    :setw -g monitor-activity on
    
    Run Code Online (Sandbox Code Playgroud)
  2. 只要输出暂时没有变化(此处为30秒),就会监视并发出警报:

    :set -g visual-silence on
    :setw -g monitor-silence 30
    
    Run Code Online (Sandbox Code Playgroud)
  3. (不推荐使用并且有一天会被更好的选项取代)监视和警告whevener输出包含匹配给定模式的字符串(并且可能运行您的命令my-command; echo foobar):

    :set -g visual-content on
    :setw -g monitor-content foo*bar
    
    Run Code Online (Sandbox Code Playgroud)
  4. $ some-command; tmux display-message "Task 1 done".但是,该消息仅显示通过定义的短暂持续时间:set -g display-time 4000.

如果保持visual-*to off(默认值),它将仅突出显示警报发生的窗口的名称,而不显示全局警报状态消息.

有关每个设置的详细信息,请参见tmux手册页

更新(感谢Steven Lu)

  • 监控内容似乎已被删除。但是无论如何,更强大的技术可能类似于“ my-command”。tmux display-message“我们在这里完成了!” (2认同)

psp*_*940 6

我终于找到了适合我的解决方案。我zsh用于我的 shell,它有一个名为“Hook Functions”的功能——在某些操作上执行的 shell 函数:http: //zsh.sourceforge.net/Doc/Release/Functions.html

很可能其他 shell 也有类似的功能。

我使用的钩子函数是precmd,每次出现提示时都会执行。即,当命令刚刚完成运行时。

在我的.zshrc

precmd () {
  echo -n -e "\a"
}  
Run Code Online (Sandbox Code Playgroud)

这会向 发送一个铃声tmux,使其仅突出显示该命令正在运行的窗口。

如果您已经专注于该tmux窗口,则不会执行任何操作,因为铃声会立即清除。

这种方法的好处是它不会触发所有视觉活动。它仅在命令完成时触发。

  • 当前窗口上的铃声只是通过在 tmux 中设置的 `set-option -g bell-action other` 清除,否则你在每个命令上都会收到一个铃声,并且必须等到铃声结束。如果你曾经在没有 tmux 的情况下使用过你的 shell,那么每个命令上都有一个铃铛。 (2认同)

小智 2

您可以使用 && bash 衍生品包装正在运行的脚本,它将调用 tmux 命令来通知您。使用 && 意味着只有当脚本以错误代码 0 退出时您才会收到通知。如果您希望它无论如何都通知您,只需使用 ;

至于包装脚本的 tmux 命令,看看这些命令,它们应该足够了 select-window split-window -h 'exec echo...' send-keys