我有一个在远程服务器上运行的 shell 脚本,我想让 i3 窗口状态变为紧急,以便工作区按钮变为红色。我该如何实现?
答案1
许多终端可以在其窗口上设置紧急标志,如果钟形字符- \a
- 被打印出来。因此
me-runs-long-time.sh ; echo -e '\a'
应该可以解决问题。记住i3当窗口聚焦或已经聚焦时,将立即删除紧急标志。因此,您可以通过运行来测试这是否有效
sleep 3; echo -e '\a'
并立即聚焦另一个窗口。
笔记:终端可能需要针对此行为进行配置:
对于
rxvt-unicode
资源,urgentOnBell
需要设置为True
。对于xterm
它是资源bellIsUrgent
。您可以根据发行版在~/.Xresources
或中设置资源。~/.Xdefaults
XTerm*bellIsUrgent: True URxvt.urgentOnBell: True
运行
xrdb ~/.Xresources
或重新启动 X 会话以启用更改(对于新终端)。可以通过在其配置中设置选项来
termite
启用此功能- :urgent_on_bell
true
~/.config/termite/config
[options] urgent_on_bell = true
这将立即对任何新的白蚁窗户起作用。
当然,上述解决方案取决于你; echo -e '\a'
每次都记得附加。有几种方法可以自动执行此操作。例如:
一个简单的解决方法就是在脚本本身中在适当的时间输出
\a
。这当然需要写权限,并且需要为每个脚本单独执行。如果您使用
zsh
,您可以将以下内容添加到您的~/.zshrc
(在远程机器上):# this may already be in your ~/.zshrc autoload -Uz add-zsh-hook # duration in seconds after which a bell should be sent typeset -i LONGRUNTIME=60 # function to save time at which a command was started save_starttime () { starttime=$SECONDS } # function to print \a if the command took longer than LONGRUNTIME set_longrunning_alert () { if ((LONGRUNTIME > 0 && SECONDS - starttime >= LONGRUNTIME)); then print "\a" fi } # run save_starttime before a command is executed add-zsh-hook preexec save_starttime # run set_longrunning_alert after a command finishes (before the prompt) add-zsh-hook precmd set_longrunning_alert
这将自动打印钟形字符如果某个命令花费的时间超过一分钟。
如果您使用,
bash
您可以在远程机器上使用以下命令。PROMPT_COMMAND='echo -e "\a"'
这将运行
echo -e "\a"
每一个发出主提示之前的时间。虽然这会在每个命令之后将窗口标记为紧急,但在大多数情况下并不明显,因为不会在焦点窗口上保留紧急标志。
bash
如果您在本地计算机上也使用或的设置,则在 SSH 连接断开时也会收到通知(仅在 几秒后断开的zsh
情况下)。当然,假设您从 shell 启动。zsh
LONGRUNTIME
ssh