有没有办法使用带有 -d 参数的“watch”,以便显示变化时图形效果消失,并且每次刷新时播放潜艇声音?

有没有办法使用带有 -d 参数的“watch”,以便显示变化时图形效果消失,并且每次刷新时播放潜艇声音?

是否可以在普通终端中添加这些效果?修改终端?从头开始编写一些代码以增加乐趣?每 3 秒播放一次声音,并在 3 秒内平滑降低光标高亮的强度。

答案1

这是一个有趣的想法。我会用它。

不幸的是,终端不支持淡入淡出文本或淡入淡出反向视频。因此,您可以选择一些 ANSI 颜色来循环并自行重写屏幕。这让您完全陷入“从头开始编写代码以取乐”的境地。

此任务可以使用 Bash、Python、C 或数百种其他能够执行 shell 命令的语言中的任意一种来完成。选择一种您想要学习或已经熟悉的语言。

假设您正在使用 bash 或其他 shell,您可以使用命令play(来自 sox 包)播放音频。还有许多其他命令行媒体播放器根据音频格式进行选择。

解析 的输出watch -d以识别更改会有点困难。大多数命令管道都喜欢处理完整的文件。从无休止的文件(如 的 stdout)中检测屏幕刷新watch -d并将其拆分成块是关键。您可能会发现将监视的命令的输出存储在变量或临时文件中更容易,您可以在下次运行中对其进行比较。

下面是一个如何在 bash 中开始行动的例子:

#!/bin/bash
# depends on wdiff, play and cmp
# sudo apt install wdiff sox diffutils
#
# Takes the command to watch as arguments. Example:
# ./submarine-watch.sh date

CMD="$@"
CLEAR="\e[H\e[J"

show_change() {
    for bg in {251..232}; do
        fg=$((256-(bg>244)*(bg-245)*4))
        DISPLAY=$(
            wdiff -1y"\e[48;5;${bg};38;5;${fg}m" -z"\e[0m" \
                <(echo "$OUT") <(echo "$NEWOUT")
            )
        echo -e "${CLEAR}$DISPLAY"
        sleep 0.15
    done
    echo -e "${CLEAR}$NEWOUT"
}

OUT=$($CMD)
echo -e "${CLEAR}$OUT"
while true; do
    sleep 5  # update interval in seconds, like watch -n
    NEWOUT=$($CMD)
    if ! cmp -s <(echo "$OUT") <(echo "$NEWOUT"); then
        play ~/Music/submarine.wav &>/dev/null &
        show_change &
    fi
    NEWOUT="$OUT"
done

我们可以像这样运行:./submarine-watch.sh date 检查输出动画:導播

此示例的硬编码刷新率为 5 秒。您可以添加参数解析或仅更改硬编码延迟以满足您的需求。此示例在运行提供的任何命令之前不进行输入验证。您的安全蜘蛛感应应该会大大增强。请勿在共享系统上以任何提升的权限使用此示例。

相关内容