tool-moyu.sh 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. #!/bin/bash
  2. # =============================================================
  3. # tool-moyu.sh — AI「摸鱼」模拟器
  4. #
  5. # 作用:读取一段内容(默认本会话日志,或任意文件/stdin),
  6. # 循环「假装在处理」,模拟 AI 工作的样子。
  7. # 适合:需要看起来在干活、又不想真干活的时候 😏
  8. #
  9. # 用法:
  10. # ./tool-moyu.sh # 用内置内容摸鱼(默认)
  11. # ./tool-moyu.sh -n 3 # 循环 3 遍
  12. # ./tool-moyu.sh [文件] # 从文件读取(覆盖内置内容)
  13. # ./tool-moyu.sh --help # 帮助
  14. #
  15. # 选项:
  16. # -n N 循环 N 次(默认无限)
  17. # -d MS 每行间隔毫秒(默认随机 80-400)
  18. # -t 逐个字符「打字」效果
  19. # -s 静默模式:不打印假状态行,只循环内容
  20. # =============================================================
  21. set -euo pipefail
  22. LOOP_TIMES=0 # 0 = 无限
  23. DELAY_MS=0 # 0 = 随机 80-400
  24. TYPE_EFFECT=0
  25. SILENT=0
  26. show_usage() {
  27. sed -n '1,20p' "$0"
  28. exit 0
  29. }
  30. while [ $# -gt 0 ]; do
  31. case "$1" in
  32. -n) LOOP_TIMES="${2:?}"; shift 2 ;;
  33. -d) DELAY_MS="${2:?}"; shift 2 ;;
  34. -t) TYPE_EFFECT=1; shift ;;
  35. -s) SILENT=1; shift ;;
  36. --help|-h) show_usage ;;
  37. -*) echo "未知选项: $1" >&2; exit 1 ;;
  38. *) break ;;
  39. esac
  40. done
  41. # 内置摸鱼内容(模拟一段 AI 工作汇报,可被文件参数覆盖)
  42. BUILTIN_CONTENT=$(cat <<'EOF'
  43. [13:00] 收到需求:搭建 CI/CD 部署链路
  44. [13:05] 🤖 分析项目结构,识别 Gogs 仓库与子模块布局
  45. [13:12] 🧠 评估方案:服务器资源紧张,改用本地校验+SSH 部署
  46. [13:20] ✍️ 编写 validate.sh / build.sh / deploy.sh 脚本
  47. [13:35] ⚙️ 本地构建部署包,交叉编译后端 + 前端 dist
  48. [13:48] 🔍 修复迁移目录缺失导致的无限重启问题
  49. [14:00] 📝 编写 aaPanel 部署手册,固化端口与域名
  50. [14:15] ✅ 本地冒烟测试通过:MySQL 8.0 迁移链路正常
  51. [14:30] 🚀 部署 admin 后端到测试机,服务 active
  52. [14:40] 🌐 前端自动化部署完成,HTTP 200
  53. [14:50] 📊 汇总进度,更新 backlog 留档
  54. [15:00] 💬 下一步:部署 backend-app,建立 client/worker 站点
  55. EOF
  56. )
  57. # 内容来源:文件参数 > 内置内容
  58. CONTENT="${1:-}"
  59. if [ -n "$CONTENT" ] && [ -f "$CONTENT" ]; then
  60. mapfile -t LINES < "$CONTENT"
  61. elif [ -n "$CONTENT" ] && [ "$CONTENT" != "-" ]; then
  62. echo "文件不存在: $CONTENT,改用内置内容。" >&2
  63. mapfile -t LINES <<< "$BUILTIN_CONTENT"
  64. else
  65. mapfile -t LINES <<< "$BUILTIN_CONTENT"
  66. fi
  67. [ "${#LINES[@]}" -eq 0 ] && { echo "内容为空,摸不了鱼。" >&2; exit 1; }
  68. # 随机延时
  69. rand_delay() {
  70. if [ "$DELAY_MS" -gt 0 ]; then sleep "$(awk -v d="$DELAY_MS" 'BEGIN{printf "%.3f", d/1000}')";
  71. else sleep "$(awk -v lo=80 -v hi=400 'BEGIN{srand(); printf "%.3f", (lo+int(rand()*(hi-lo+1)))/1000}')"; fi
  72. }
  73. # 假 AI 状态行(随机挑一个)
  74. STATUS=(
  75. "🤖 分析会话上下文..."
  76. "🧠 正在思考..."
  77. "📊 汇总关键决策点..."
  78. "✍️ 生成执行摘要..."
  79. "🔍 检索知识图谱..."
  80. "⚙️ 优化实现方案..."
  81. "📝 撰写技术文档..."
  82. "✅ 校验代码质量..."
  83. "🔄 同步进度汇报..."
  84. "💬 生成下一步建议..."
  85. )
  86. run_once() {
  87. local idx=0 total="${#LINES[@]}"
  88. for line in "${LINES[@]}"; do
  89. idx=$((idx+1))
  90. [ "$SILENT" = "0" ] && [ $((RANDOM % 6)) -eq 0 ] && {
  91. printf "\r\033[K%s" "${STATUS[$((RANDOM % ${#STATUS[@]}))]}"
  92. rand_delay
  93. }
  94. if [ "$TYPE_EFFECT" = "1" ]; then
  95. local i
  96. for ((i=0; i<${#line}; i++)); do printf "%s" "${line:i:1}"; rand_delay; done
  97. echo ""
  98. else
  99. echo "$line"
  100. fi
  101. rand_delay
  102. done
  103. echo "" # 每遍之间空行
  104. }
  105. n=0
  106. while [ "$LOOP_TIMES" -eq 0 ] || [ "$n" -lt "$LOOP_TIMES" ]; do
  107. n=$((n+1))
  108. [ "$SILENT" = "0" ] && echo "—— 第 $n 遍摸鱼中 ——"
  109. run_once
  110. done
  111. [ "$SILENT" = "0" ] && echo "🎣 摸鱼结束。看起来一直很忙,实际上啥也没干。"
  112. exit 0