|
@@ -0,0 +1,102 @@
|
|
|
|
|
+#!/bin/bash
|
|
|
|
|
+# =============================================================
|
|
|
|
|
+# tool-moyu.sh — AI「摸鱼」模拟器
|
|
|
|
|
+#
|
|
|
|
|
+# 作用:读取一段内容(默认本会话日志,或任意文件/stdin),
|
|
|
|
|
+# 循环「假装在处理」,模拟 AI 工作的样子。
|
|
|
|
|
+# 适合:需要看起来在干活、又不想真干活的时候 😏
|
|
|
|
|
+#
|
|
|
|
|
+# 用法:
|
|
|
|
|
+# ./tool-moyu.sh [文件] # 从文件读取,无限循环摸鱼
|
|
|
|
|
+# ./tool-moyu.sh -n 3 文件 # 只循环 3 遍
|
|
|
|
|
+# ./tool-moyu.sh < session.log # 从标准输入读取
|
|
|
|
|
+# ./tool-moyu.sh --help # 帮助
|
|
|
|
|
+#
|
|
|
|
|
+# 选项:
|
|
|
|
|
+# -n N 循环 N 次(默认无限)
|
|
|
|
|
+# -d MS 每行间隔毫秒(默认随机 80-400)
|
|
|
|
|
+# -t 逐个字符「打字」效果
|
|
|
|
|
+# -s 静默模式:不打印假状态行,只循环原内容
|
|
|
|
|
+# =============================================================
|
|
|
|
|
+
|
|
|
|
|
+set -euo pipefail
|
|
|
|
|
+
|
|
|
|
|
+LOOP_TIMES=0 # 0 = 无限
|
|
|
|
|
+DELAY_MS=0 # 0 = 随机 80-400
|
|
|
|
|
+TYPE_EFFECT=0
|
|
|
|
|
+SILENT=0
|
|
|
|
|
+
|
|
|
|
|
+show_usage() {
|
|
|
|
|
+ sed -n '1,20p' "$0"
|
|
|
|
|
+ exit 0
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+while [ $# -gt 0 ]; do
|
|
|
|
|
+ case "$1" in
|
|
|
|
|
+ -n) LOOP_TIMES="${2:?}"; shift 2 ;;
|
|
|
|
|
+ -d) DELAY_MS="${2:?}"; shift 2 ;;
|
|
|
|
|
+ -t) TYPE_EFFECT=1; shift ;;
|
|
|
|
|
+ -s) SILENT=1; shift ;;
|
|
|
|
|
+ --help|-h) show_usage ;;
|
|
|
|
|
+ -*) echo "未知选项: $1" >&2; exit 1 ;;
|
|
|
|
|
+ *) break ;;
|
|
|
|
|
+ esac
|
|
|
|
|
+done
|
|
|
|
|
+
|
|
|
|
|
+# 内容来源:文件参数或 stdin
|
|
|
|
|
+CONTENT="${1:-/dev/stdin}"
|
|
|
|
|
+if [ -f "$CONTENT" ]; then
|
|
|
|
|
+ mapfile -t LINES < "$CONTENT"
|
|
|
|
|
+else
|
|
|
|
|
+ mapfile -t LINES
|
|
|
|
|
+fi
|
|
|
|
|
+[ "${#LINES[@]}" -eq 0 ] && { echo "内容为空,摸不了鱼。" >&2; exit 1; }
|
|
|
|
|
+
|
|
|
|
|
+# 随机延时
|
|
|
|
|
+rand_delay() {
|
|
|
|
|
+ if [ "$DELAY_MS" -gt 0 ]; then sleep "$(awk -v d="$DELAY_MS" 'BEGIN{printf "%.3f", d/1000}')";
|
|
|
|
|
+ else sleep "$(awk -v lo=80 -v hi=400 'BEGIN{srand(); printf "%.3f", (lo+int(rand()*(hi-lo+1)))/1000}')"; fi
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+# 假 AI 状态行(随机挑一个)
|
|
|
|
|
+STATUS=(
|
|
|
|
|
+ "🤖 分析会话上下文..."
|
|
|
|
|
+ "🧠 正在思考..."
|
|
|
|
|
+ "📊 汇总关键决策点..."
|
|
|
|
|
+ "✍️ 生成执行摘要..."
|
|
|
|
|
+ "🔍 检索知识图谱..."
|
|
|
|
|
+ "⚙️ 优化实现方案..."
|
|
|
|
|
+ "📝 撰写技术文档..."
|
|
|
|
|
+ "✅ 校验代码质量..."
|
|
|
|
|
+ "🔄 同步进度汇报..."
|
|
|
|
|
+ "💬 生成下一步建议..."
|
|
|
|
|
+)
|
|
|
|
|
+
|
|
|
|
|
+run_once() {
|
|
|
|
|
+ local idx=0 total="${#LINES[@]}"
|
|
|
|
|
+ for line in "${LINES[@]}"; do
|
|
|
|
|
+ idx=$((idx+1))
|
|
|
|
|
+ [ "$SILENT" = "0" ] && [ $((RANDOM % 6)) -eq 0 ] && {
|
|
|
|
|
+ printf "\r\033[K%s" "${STATUS[$((RANDOM % ${#STATUS[@]}))]}"
|
|
|
|
|
+ rand_delay
|
|
|
|
|
+ }
|
|
|
|
|
+ if [ "$TYPE_EFFECT" = "1" ]; then
|
|
|
|
|
+ local i
|
|
|
|
|
+ for ((i=0; i<${#line}; i++)); do printf "%s" "${line:i:1}"; rand_delay; done
|
|
|
|
|
+ echo ""
|
|
|
|
|
+ else
|
|
|
|
|
+ echo "$line"
|
|
|
|
|
+ fi
|
|
|
|
|
+ rand_delay
|
|
|
|
|
+ done
|
|
|
|
|
+ echo "" # 每遍之间空行
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+n=0
|
|
|
|
|
+while [ "$LOOP_TIMES" -eq 0 ] || [ "$n" -lt "$LOOP_TIMES" ]; do
|
|
|
|
|
+ n=$((n+1))
|
|
|
|
|
+ [ "$SILENT" = "0" ] && echo "—— 第 $n 遍摸鱼中 ——"
|
|
|
|
|
+ run_once
|
|
|
|
|
+done
|
|
|
|
|
+[ "$SILENT" = "0" ] && echo "🎣 摸鱼结束。看起来一直很忙,实际上啥也没干。"
|
|
|
|
|
+exit 0
|