|
|
@@ -21,8 +21,8 @@
|
|
|
|
|
|
set -euo pipefail
|
|
|
|
|
|
-LOOP_TIMES=0 # 0 = 无限
|
|
|
-DELAY_MS=0 # 0 = 随机 80-400
|
|
|
+LOOP_TIMES=0 # 0 = 无限
|
|
|
+DELAY_MS=0 # 0 = 随机 80-400
|
|
|
TYPE_EFFECT=0
|
|
|
SILENT=0
|
|
|
|
|
|
@@ -33,13 +33,28 @@ show_usage() {
|
|
|
|
|
|
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 "Unknown option: $1" >&2; exit 1 ;;
|
|
|
- *) break ;;
|
|
|
+ -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 "Unknown option: $1" >&2
|
|
|
+ exit 1
|
|
|
+ ;;
|
|
|
+ *) break ;;
|
|
|
esac
|
|
|
done
|
|
|
|
|
|
@@ -103,7 +118,7 @@ OUTPUTS=(
|
|
|
"Active: active (running)"
|
|
|
"[GIN-debug] Listening and serving HTTP on :8081"
|
|
|
"warn: chunk size exceeds 4000 kB"
|
|
|
- "ERROR: failed to open source \"file://internal/migrations\""
|
|
|
+ 'ERROR: failed to open source "file://internal/migrations"'
|
|
|
"FATAL: database connection refused, retrying..."
|
|
|
"0 error(s), 5 warning(s)"
|
|
|
"migrations completed successfully"
|
|
|
@@ -114,15 +129,15 @@ OUTPUTS=(
|
|
|
|
|
|
# 动态随机数字行(消除固定值反复出现)
|
|
|
gen_rand_lines() {
|
|
|
- local n=$((1 + RANDOM % 3)) # 1-3 条
|
|
|
+ local n=$((1 + RANDOM % 3)) # 1-3 条
|
|
|
local i r
|
|
|
- for ((i=0;i<n;i++)); do
|
|
|
+ for ((i = 0; i < n; i++)); do
|
|
|
r=$((RANDOM % 4))
|
|
|
case $r in
|
|
|
- 0) echo "ok $(awk 'BEGIN{srand(); printf "%.3f", 0.05+rand()*1.5}')s" ;;
|
|
|
- 1) echo "dist/assets/index-*.js $(awk 'BEGIN{srand(); printf "%.2f", 8+rand()*300}') kB │ gzip: $(awk 'BEGIN{srand(); printf "%.2f", 3+rand()*80}') kB" ;;
|
|
|
- 2) echo "Progress: $((5+RANDOM%95))%..." ;;
|
|
|
- 3) echo "$((1+RANDOM%40)) test(s), $((RANDOM%4)) failed" ;;
|
|
|
+ 0) echo "ok $(awk 'BEGIN{srand(); printf "%.3f", 0.05+rand()*1.5}')s" ;;
|
|
|
+ 1) echo "dist/assets/index-*.js $(awk 'BEGIN{srand(); printf "%.2f", 8+rand()*300}') kB │ gzip: $(awk 'BEGIN{srand(); printf "%.2f", 3+rand()*80}') kB" ;;
|
|
|
+ 2) echo "Progress: $((5 + RANDOM % 95))%..." ;;
|
|
|
+ 3) echo "$((1 + RANDOM % 40)) test(s), $((RANDOM % 4)) failed" ;;
|
|
|
esac
|
|
|
done
|
|
|
}
|
|
|
@@ -131,45 +146,45 @@ gen_rand_lines() {
|
|
|
pick_unique() {
|
|
|
local count=$1 pool=$2
|
|
|
[ "$pool" -lt "$count" ] && count=$pool
|
|
|
- seq 0 $((pool-1)) | sort -R | head -n "$count"
|
|
|
+ seq 0 $((pool - 1)) | sort -R | head -n "$count"
|
|
|
}
|
|
|
|
|
|
# 随机生成一段“工作日志”:命令(约一半带输出)+独立行+裸输出+动态数字,洗牌打乱
|
|
|
# 块大小不规则、数字随机化,消除固定模式与重复数字
|
|
|
gen_random_content() {
|
|
|
- local cmdc=$((1 + RANDOM % 5)) # 1-5 条命令
|
|
|
- local stc=$((2 + RANDOM % 6)) # 2-7 条独立行
|
|
|
+ local cmdc=$((1 + RANDOM % 5)) # 1-5 条命令
|
|
|
+ local stc=$((2 + RANDOM % 6)) # 2-7 条独立行
|
|
|
local ci si oi i
|
|
|
LINES=()
|
|
|
# 命令:约一半紧跟输出(不一定成对,制造不规则块)
|
|
|
for ci in $(pick_unique "$cmdc" "${#COMMANDS[@]}"); do
|
|
|
LINES+=("\$ ${COMMANDS[$ci]}")
|
|
|
if [ $((RANDOM % 2)) -eq 0 ]; then LINES+=("${COMMAND_OUT[$ci]}"); fi
|
|
|
- [ $((RANDOM % 4)) -eq 0 ] && LINES+=("") # 随机空行
|
|
|
+ [ $((RANDOM % 4)) -eq 0 ] && LINES+=("") # 随机空行
|
|
|
done
|
|
|
# 独立行(不重复)
|
|
|
for si in $(pick_unique "$stc" "${#STANDALONE[@]}"); do
|
|
|
LINES+=("${STANDALONE[$si]}")
|
|
|
- [ $((RANDOM % 3)) -eq 0 ] && LINES+=("") # 随机空行
|
|
|
+ [ $((RANDOM % 3)) -eq 0 ] && LINES+=("") # 随机空行
|
|
|
done
|
|
|
# 裸输出行(可重复)
|
|
|
- for ((i=0;i<$((2+RANDOM%4));i++)); do
|
|
|
+ for ((i = 0; i < $((2 + RANDOM % 4)); i++)); do
|
|
|
LINES+=("${OUTPUTS[$((RANDOM % ${#OUTPUTS[@]}))]}")
|
|
|
done
|
|
|
# 动态随机数字行
|
|
|
while IFS= read -r l; do LINES+=("$l"); done < <(gen_rand_lines)
|
|
|
# 洗牌打乱整体顺序
|
|
|
- local idx=($(seq 0 $((${#LINES[@]}-1)) | sort -R))
|
|
|
+ local idx=($(seq 0 $((${#LINES[@]} - 1)) | sort -R))
|
|
|
local shuffled=()
|
|
|
for i in "${idx[@]}"; do shuffled+=("${LINES[$i]}"); done
|
|
|
LINES=("${shuffled[@]}")
|
|
|
}
|
|
|
|
|
|
# 内容来源:文件参数 > 随机生成
|
|
|
-CONTENT="${1:-}"
|
|
|
+CONTENT="${1-}"
|
|
|
FILE_MODE=0
|
|
|
if [ -n "$CONTENT" ] && [ -f "$CONTENT" ]; then
|
|
|
- mapfile -t LINES < "$CONTENT"
|
|
|
+ mapfile -t LINES <"$CONTENT"
|
|
|
FILE_MODE=1
|
|
|
elif [ -n "$CONTENT" ] && [ "$CONTENT" != "-" ]; then
|
|
|
echo "File not found: $CONTENT, falling back to random content." >&2
|
|
|
@@ -177,11 +192,15 @@ elif [ -n "$CONTENT" ] && [ "$CONTENT" != "-" ]; then
|
|
|
else
|
|
|
gen_random_content
|
|
|
fi
|
|
|
-[ "${#LINES[@]}" -eq 0 ] && { echo "Content empty, nothing to slack on." >&2; exit 1; }
|
|
|
+[ "${#LINES[@]}" -eq 0 ] && {
|
|
|
+ echo "Content empty, nothing to slack on." >&2
|
|
|
+ exit 1
|
|
|
+}
|
|
|
|
|
|
# 随机延时
|
|
|
rand_delay() {
|
|
|
- if [ "$DELAY_MS" -gt 0 ]; then sleep "$(awk -v d="$DELAY_MS" 'BEGIN{printf "%.3f", d/1000}')";
|
|
|
+ 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
|
|
|
}
|
|
|
|
|
|
@@ -190,19 +209,22 @@ run_once() {
|
|
|
for line in "${LINES[@]}"; do
|
|
|
if [ "$TYPE_EFFECT" = "1" ]; then
|
|
|
local i
|
|
|
- for ((i=0; i<${#line}; i++)); do printf "%s" "${line:i:1}"; rand_delay; done
|
|
|
+ for ((i = 0; i < ${#line}; i++)); do
|
|
|
+ printf "%s" "${line:i:1}"
|
|
|
+ rand_delay
|
|
|
+ done
|
|
|
echo ""
|
|
|
else
|
|
|
echo "$line"
|
|
|
fi
|
|
|
rand_delay
|
|
|
done
|
|
|
- echo "" # 每遍之间空行
|
|
|
+ echo "" # 每遍之间空行
|
|
|
}
|
|
|
|
|
|
n=0
|
|
|
while [ "$LOOP_TIMES" -eq 0 ] || [ "$n" -lt "$LOOP_TIMES" ]; do
|
|
|
- n=$((n+1))
|
|
|
+ n=$((n + 1))
|
|
|
# 每轮重新生成随机内容(避免内容固定导致反复重复);文件模式则用固定内容
|
|
|
[ "$FILE_MODE" = "0" ] && gen_random_content
|
|
|
run_once
|