WSL中执行命令结束后发送一个Windows系统通知

需求场景:本人使用 Windows 10 操作系统,终端为 WSL(Windows Subsystem for Linux) 就是一个 Linux 子系统,可以运行各种 Linux命令,当我用 wget 下载一个大的文件的时候,可能要等很久,但是我不知道什么时候会下载完,这时候需要他完成之后给我发一个通知,这个通知在原生 Linux 和 Mac 上是比较容易的,这里说一下在 Windows 下的设置。

Linux 子系统默认是 Ubuntu,网上也又教程可以安装其他系统,比如我试过 Arch。终端我没有使用 bash,比较喜欢 fish,有一个 omf(Oh My Fish) 插件系统,有各种插件和主题。

安装 done

要在命令执行结束发一个通知,需要一个插件:https://github.com/fisherman/done
这个插件是用 fisherman 来安装的,但是我用的 omf,所以需要手动安装一下。

1
2
curl -Lo ~/.config/fish/functions/humanize_duration.fish --create-dirs https://raw.githubusercontent.com/fisherman/humanize_duration/master/humanize_duration.fish
curl -Lo ~/.config/fish/conf.d/done.fish --create-dirs https://raw.githubusercontent.com/fisherman/done/master/conf.d/done.fish

安装 BurntToast

然后需要在 Windows PowerShell 里面执行如下命令:

1
2
PS C:\WINDOWS\system32> Install-Module -Name BurntToast
PS C:\WINDOWS\system32> New-BurntToastNotification -Text test-ok

不受信任的存储库
你正在从不受信任的存储库安装模块。如果你信任该存储库,请通过运行 Set-PSRepository cmdlet 更改其 InstallationPolicy
值。是否确实要从“PSGallery”安装模块?
[Y] 是(Y) [A] 全是(A) [N] 否(N) [L] 全否(L) [S] 暂停(S) [?] 帮助 (默认值为“N”):

我选择 A,然后就安装好了 BurntToast。

配置 fish

最后在 ~/.config/fish/config.fish 里面加入下面的配置:

1
2
3
set -U __done_min_cmd_duration 5000  # 执行时间超过多少 ms 需要发送通知,default: 5000 ms
set -U __done_exclude 'git (?!push|pull)' # default: all git commands, except push and pull. accepts a regex.
set -U __done_notification_command 'powershell.exe -command New-BurntToastNotification -Text WSL-ok' # -Text 后面的内容随意填写

然后重新进入 fish,执行 sleep 6,6s之后就能收到通知啦!