gpt4 book ai didi

bash - bash 命令结束时发出声音

转载 作者:行者123 更新时间:2023-11-29 09:26:23 26 4
gpt4 key购买 nike

当我在 bash 中启动一个长命令时,我需要在命令完成时发出信号。

如何在 .bashrc 中为所有长命令制作?

我有 alsa 的声音。

在 google 中搜索没有结果。

最佳答案

我有同样的问题,感谢@rici 的回答,我能够想出一个可行的解决方案。如果需要,您可以将 PROMPT_COMMAND 加入一行,或者像这样保留它:

trap '_T=${_T:-$SECONDS}' DEBUG
PROMPT_COMMAND='
((SECONDS - _T > 10)) &&
{ play ~/done.wav &disown;}&>/dev/null;
unset _T
'

每当命令行需要超过 10 秒才能完成时,此设置组合将播放 ~/done.wav。只是让您的终端闲置,它不会播放声音。

在 OS X 上,播放声音的命令是 afplay,一些声音可以在 /System/Library/Sounds 中找到

但上面的版本无法区分长时间运行的批处理命令(我们需要声音)和交互式命令,例如您选择的终端编辑器、手册页、|less 等.

这是一个版本,99% 的情况下,通过检查最后一个命令行与带有一个人的常见交互程序或管道列表的正则表达式:

trap '_T=${_T:-$SECONDS}' DEBUG
PROMPT_COMMAND='
if ((SECONDS - _T > 10)); then
l=$(history 1);
[[ ! ${l:7} =~ (^vim|^man|^ssh|less$) ]] &&
{ play ~/done.wav &disown;}&>/dev/null;
fi;
unset _T
'

您应该根据口味调整正则表达式。同样,如果需要,您可以将 PROMPT_COMMAND 加入一行,我将 ; 留在了它们应该在一行中的位置。

这仍然是有效的,因为:

  • shell 在评估任一 Hook 时不会产生任何外部进程(除了在后台启动的明显声音播放);
  • DEBUG hook 非常快;我相信在第一个 DEBUG 和 PROMPT_COMMAND 中,它甚至不会在每个命令行中访问“魔法变量”$SECONDS(这可能会强制系统调用获取当前时间)超过两次以比较值;
  • 仅当命令花费的时间超过 N 秒时才会执行历史检查和正则表达式。

工作原理

要了解其工作原理,您可以设置这些调试打印:

trap 'echo DEBUG' DEBUG
PROMPT_COMMAND='echo PROMPT_COMMAND'

然后注意他们什么时候被调用:

PROMPT_COMMAND
$ sleep 2; sleep 2
DEBUG
(1st sleep takes its time)
DEBUG
(2nd sleep takes its time)
DEBUG
PROMPT_COMMAND
$ (user waits before pressing enter)
DEBUG
PROMPT_COMMAND
$

鉴于此,我上面的设置:

  • 每当向用户显示提示时取消设置 _T — 在 $PROMPT_COMMAND 的末尾;
  • 如果 _T 未设置,这发生在每个命令行的第一个 DEBUG 中,就在您按下 enter 之后;然后将其设置为当前时间(使用 $SECONDS,这比启动外部 date 进程更有效);
  • 在下一个提示符下,将 _T 与当前时间进行比较并在需要时播放声音,在后台启动播放命令并丢弃任何输出(包括 [1] PID 和其他与工作相关的信息。)

关于bash - bash 命令结束时发出声音,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20165950/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com