Compare commits
6 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 8a3802c4b7 | |||
| 09769a0dd1 | |||
| 3bc2147e36 | |||
| 6047dff71b | |||
| 147fdb1482 | |||
| ef11871ba4 |
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "isep",
|
"name": "isep",
|
||||||
"description": "InkStone Environment Plugin —— leo 的 Claude Code 環境唯一真相源:62 支機械閘(88 條註冊,白話盤點見 docs/hooks-inventory.md)、7 支 slash command、2 支 skill、8 位有名字的工人(agents/,見 docs/governance/worker-roster.md)、65 支腳本,外加治理規範與標籤真相源。本機與雲端裝同一份,沒有子集。",
|
"description": "InkStone Environment Plugin —— leo 的 Claude Code 環境唯一真相源:62 支機械閘(88 條註冊,白話盤點見 docs/hooks-inventory.md)、7 支 slash command、2 支 skill、8 位有名字的工人(agents/,見 docs/governance/worker-roster.md)、65 支腳本,外加治理規範與標籤真相源。本機與雲端裝同一份,沒有子集。",
|
||||||
"version": "0.30.7",
|
"version": "0.30.10",
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"inkstone",
|
"inkstone",
|
||||||
"guardrails",
|
"guardrails",
|
||||||
|
|||||||
@@ -0,0 +1,11 @@
|
|||||||
|
# 雲端環境(claude.ai Cloud environment)變數清單的版本紀錄——**只記名字,不記值**。
|
||||||
|
# leo 2026-09-18:「你這裡記錄每版的 credential 的 key,但 value 自動產生,我就貼上去,你要有版本,因為這件事做了很多次,但你都沒記錄版本」
|
||||||
|
# 產生器 scripts/make-cloud-env.sh 讀本檔最後一版的號碼印在產物檔頭,並列出與前一版的差異。
|
||||||
|
# 欄位:版本<TAB>日期<TAB>key(逗號分隔,順序=NEEDED)<TAB>為什麼變
|
||||||
|
v1 2026-08-20 GITEA_TOKEN_CLAUDE_CODE 首版:雲端 bootstrap 與 plugin 安裝(f855d82)
|
||||||
|
v2 2026-09-01 GITEA_TOKEN_CLAUDE_CODE,CLOUDFLARE_API_TOKEN_YOULIN_CC_USE 雲端拿得到 youlin 的 CF token(ISEP#115 c5526,ca9ea99)
|
||||||
|
v3 2026-09-01 GITEA_TOKEN_CLAUDE_CODE,CLOUDFLARE_API_TOKEN_YOULIN_CC_USE,CLOUDFLARE_ACCOUNT_ID_YOULIN,YOULIN_MCP_OWNER_SECRETS,STAGE_USERNAME_YOULIN,STAGE_PASSWORD_YOULIN,CLOUDFLARE_API_TOKEN_CC_SHIPPING_CORE,CLOUDFLARE_ACCOUNT_ID_GEEK6688 leo「youlin 和 geek6688 都全給」(ISEP#115 c5541/5542,7aef943)
|
||||||
|
v4 2026-09-01 GITEA_TOKEN_CLAUDE_CODE,CLOUDFLARE_API_TOKEN_YOULIN_CC_USE,CLOUDFLARE_ACCOUNT_ID_YOULIN,YOULIN_MCP_OWNER_SECRETS,STAGE_USERNAME_YOULIN,STAGE_PASSWORD_YOULIN,CLOUDFLARE_API_TOKEN_CC_SHIPPING_CORE,CLOUDFLARE_ACCOUNT_ID_GEEK6688,UNCLE6_CF_API_KEY 出貨三站實際部署到 uncle6(ISEP#115 c5577,cb310e9)
|
||||||
|
v5 2026-09-01 GITEA_TOKEN_CLAUDE_CODE,CLOUDFLARE_API_TOKEN_YOULIN_CC_USE,CLOUDFLARE_ACCOUNT_ID_YOULIN,YOULIN_MCP_OWNER_SECRETS,STAGE_USERNAME_YOULIN,STAGE_PASSWORD_YOULIN,CLOUDFLARE_API_TOKEN_CC_SHIPPING_CORE,CLOUDFLARE_ACCOUNT_ID_GEEK6688,UNCLE6_CF_API_KEY,ARCRUN_NS_YOULIN 出貨線實例座標(Arcrun#195,dd86fef/v0.21.0)
|
||||||
|
v6 2026-09-18 GITEA_TOKEN_CLAUDE_CODE,CLOUDFLARE_API_TOKEN_YOULIN_CC_USE,CLOUDFLARE_ACCOUNT_ID_YOULIN,YOULIN_MCP_OWNER_SECRETS,STAGE_USERNAME_YOULIN,STAGE_PASSWORD_YOULIN,CLOUDFLARE_API_TOKEN_CC_SHIPPING_CORE,CLOUDFLARE_ACCOUNT_ID_GEEK6688,UNCLE6_CF_API_KEY,ARCRUN_NS_YOULIN,ARCRUN_NS_UNCLE6,GITHUB_MIRROR_TOKEN,GITHUB_ACCOUNT_NAME 雲端要能出 stage/prod:uncle6 namespace+GitHub 鏡像兩把(InkStoneCo#98 c7739;ISEP#158)
|
||||||
|
v7 2026-09-18 GITEA_TOKEN_CLAUDE_CODE,CLOUDFLARE_API_TOKEN_YOULIN_CC_USE,CLOUDFLARE_ACCOUNT_ID_YOULIN,YOULIN_MCP_OWNER_SECRETS,STAGE_USERNAME_YOULIN,STAGE_PASSWORD_YOULIN,CLOUDFLARE_API_TOKEN_CC_SHIPPING_CORE,CLOUDFLARE_ACCOUNT_ID_GEEK6688,UNCLE6_CF_API_KEY,ARCRUN_NS_YOULIN,ARCRUN_NS_UNCLE6,GITHUB_MIRROR_TOKEN,GITHUB_ACCOUNT_NAME,TELEGRAM_CHAT_ID,TELEGRAM_BOT_TOKEN,ISEP_DRAIN 收回雲端現行卻不在 v1–v6 的三個:TELEGRAM_CHAT_ID/TELEGRAM_BOT_TOKEN(通知出口,值在 polaris/mira/.env,點名放行)+ISEP_DRAIN=1 固定值(leo 09-18 貼出現行雲端環境才發現漏收)
|
||||||
|
+65
-16
@@ -5,7 +5,7 @@
|
|||||||
# 誤觸時怎麼關: 這支不擋任何東西。不想產生就別跑;產物在版控外,刪掉即可。
|
# 誤觸時怎麼關: 這支不擋任何東西。不想產生就別跑;產物在版控外,刪掉即可。
|
||||||
#
|
#
|
||||||
# 用法:bash scripts/make-cloud-env.sh
|
# 用法:bash scripts/make-cloud-env.sh
|
||||||
# 產物:~/.claude/cloud-env/<日期>.txt(權限 600,**不在任何 repo 裡**)
|
# 產物:~/Desktop/cloud-env-<版本>-<日期>.txt(權限 600,**不在任何 repo 裡**);版本紀錄 docs/cloud-env-versions.tsv
|
||||||
# 本腳本只寫「變數名字」,值在執行當下才從既有 .env 讀出來寫進產物 —— 值不進版控、不進對話。
|
# 本腳本只寫「變數名字」,值在執行當下才從既有 .env 讀出來寫進產物 —— 值不進版控、不進對話。
|
||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
|
|
||||||
@@ -44,6 +44,28 @@ NEEDED=(
|
|||||||
# 只有 namespace 是機敏 ⇒ 走環境變數。原本只住在 ~/.arcrun/config.yaml 的 api_key,
|
# 只有 namespace 是機敏 ⇒ 走環境變數。原本只住在 ~/.arcrun/config.yaml 的 api_key,
|
||||||
# 那個檔在家目錄、不隨 clone 走 ⇒ 雲端永遠拿不到。
|
# 那個檔在家目錄、不隨 clone 走 ⇒ 雲端永遠拿不到。
|
||||||
ARCRUN_NS_YOULIN # youlin 實例的 namespace(X-Arcrun-API-Key)
|
ARCRUN_NS_YOULIN # youlin 實例的 namespace(X-Arcrun-API-Key)
|
||||||
|
ARCRUN_NS_UNCLE6 # uncle6 實例的 namespace:出貨第 1、19、20 站派給 uncle6 工作流(inkstone/InkStoneCo#98 → comment 7739)
|
||||||
|
|
||||||
|
# ── prod 出貨把產物推上 GitHub 鏡像(第 14、21、22 站)──
|
||||||
|
# 🔴 名字進清單 ≠ 雲端可以自由寫 GitHub:`github-contact-guard.sh` 照樣擋,
|
||||||
|
# 寫入仍要 D20 開閘(保險檔落在哪由 inkstone/ISEP#157 處理)。
|
||||||
|
# 進清單是因為「拿不到這兩個名字」會讓 prod 那半在雲端**連開閘之後都走不下去**。
|
||||||
|
GITHUB_MIRROR_TOKEN # GitHub 鏡像 repo 的寫入 token(走標頭,不進網址)
|
||||||
|
GITHUB_ACCOUNT_NAME # 上面那把的帳號名(組鏡像 repo 路徑用,不是機密)
|
||||||
|
|
||||||
|
# ── 雲端工人的通知出口(v7,2026-09-18:leo 貼出現行雲端環境才發現 v1–v6 漏收)──
|
||||||
|
# 雲端走 Bot API 直送(`scripts/isep-notify`;leo21c 的 notify_leo 已於 08-14 消失,InkStoneCo#110)
|
||||||
|
TELEGRAM_CHAT_ID # 收訊的 chat id(不是機密)
|
||||||
|
TELEGRAM_BOT_TOKEN # 通知 bot 的 token
|
||||||
|
)
|
||||||
|
|
||||||
|
# 🔓 例外:值只住在 polaris/mira/.env、但**不是**打得到 leo21c 的憑證——點名放行,其他照擋(B8)
|
||||||
|
# Telegram 兩把是通知 bot,不碰任何 CF 帳號;雲端 09-18 前就已手動設了同樣的值。
|
||||||
|
MIRA_ALLOWED=(TELEGRAM_CHAT_ID TELEGRAM_BOT_TOKEN)
|
||||||
|
|
||||||
|
# ── 固定值(不是金鑰,產生器直接寫)──
|
||||||
|
FIXED=(
|
||||||
|
"ISEP_DRAIN=1" # 雲端工人=接票環境:ticket pick 自帶 --pool、佇列閘不准有票就收工(ISEP#130)
|
||||||
)
|
)
|
||||||
#
|
#
|
||||||
# 🔴 這份清單的邊界——加一把之前先問「這把打得到哪個實例」,不是「這把方便嗎」
|
# 🔴 這份清單的邊界——加一把之前先問「這把打得到哪個實例」,不是「這把方便嗎」
|
||||||
@@ -91,23 +113,42 @@ lookup() { # $1=變數名 → 印出值(找不到就空)
|
|||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
|
|
||||||
# 預設丟 ~/.claude/cloud-env(權限 700)。要放別的地方= OUT_DIR=~/Desktop bash scripts/make-cloud-env.sh
|
# ── 版本(leo 2026-09-18:「你要有版本,因為這件事做了很多次,但你都沒記錄版本」)──
|
||||||
OUT_DIR="${OUT_DIR:-$HOME/.claude/cloud-env}"
|
# 真相源=docs/cloud-env-versions.tsv(只記 key,不記值)。最後一列=現行版。
|
||||||
|
# 🔴 NEEDED 跟最後一列的 key 不一致 ⇒ 拒絕產生:改了清單就必須在 tsv 加一版。
|
||||||
|
VERSIONS="$(cd "$(dirname "$0")/.." && pwd)/docs/cloud-env-versions.tsv"
|
||||||
|
[ -f "$VERSIONS" ] || { echo "🔴 找不到 $VERSIONS" >&2; exit 1; }
|
||||||
|
CUR_LINE=$(grep -v '^#' "$VERSIONS" | grep -v '^[[:space:]]*$' | tail -1)
|
||||||
|
PREV_LINE=$(grep -v '^#' "$VERSIONS" | grep -v '^[[:space:]]*$' | tail -2 | head -1)
|
||||||
|
VER=$(printf '%s' "$CUR_LINE" | cut -f1); VER_DATE=$(printf '%s' "$CUR_LINE" | cut -f2)
|
||||||
|
VER_KEYS=$(printf '%s' "$CUR_LINE" | cut -f3); VER_WHY=$(printf '%s' "$CUR_LINE" | cut -f4)
|
||||||
|
PREV_VER=$(printf '%s' "$PREV_LINE" | cut -f1); PREV_KEYS=$(printf '%s' "$PREV_LINE" | cut -f3)
|
||||||
|
FIXED_NAMES=(); for kv in "${FIXED[@]}"; do FIXED_NAMES+=("${kv%%=*}"); done
|
||||||
|
NEEDED_JOINED=$(IFS=,; printf '%s' "${NEEDED[*]} ${FIXED_NAMES[*]}" | tr ' ' ',')
|
||||||
|
if [ "$NEEDED_JOINED" != "$VER_KEYS" ]; then
|
||||||
|
echo "🔴 NEEDED 與 $VERSIONS 最後一版($VER)的 key 不一致——改了清單就要在 tsv 加一列新版本再跑。" >&2
|
||||||
|
echo " NEEDED:$NEEDED_JOINED" >&2
|
||||||
|
echo " $VER :$VER_KEYS" >&2
|
||||||
|
exit 2
|
||||||
|
fi
|
||||||
|
ADDED=$(comm -13 <(tr , '\n' <<<"$PREV_KEYS" | sort) <(tr , '\n' <<<"$VER_KEYS" | sort) | paste -sd, -)
|
||||||
|
REMOVED=$(comm -23 <(tr , '\n' <<<"$PREV_KEYS" | sort) <(tr , '\n' <<<"$VER_KEYS" | sort) | paste -sd, -)
|
||||||
|
|
||||||
|
# 預設丟桌面(leo 2026-09-18 指定)。要放別的地方= OUT_DIR=<目錄> bash scripts/make-cloud-env.sh
|
||||||
|
OUT_DIR="${OUT_DIR:-$HOME/Desktop}"
|
||||||
mkdir -p "$OUT_DIR"
|
mkdir -p "$OUT_DIR"
|
||||||
# 只在「這個目錄是我們自己造的預設位置」時才收緊權限——
|
OUT="$OUT_DIR/cloud-env-${VER}-$(date +%Y%m%d-%H%M).txt"
|
||||||
# OUT_DIR 可被覆寫,不該對使用者指定的既有目錄(例如 ~/Desktop)動權限。
|
|
||||||
[ "$OUT_DIR" = "$HOME/.claude/cloud-env" ] && chmod 700 "$OUT_DIR"
|
|
||||||
OUT="$OUT_DIR/$(date +%Y%m%d-%H%M%S).txt"
|
|
||||||
|
|
||||||
SETUP="$(cd "$(dirname "$0")/.." && pwd)/docs/cloud-setup-script.sh"
|
SETUP="$(cd "$(dirname "$0")/.." && pwd)/docs/cloud-setup-script.sh"
|
||||||
[ -f "$SETUP" ] || { echo "🔴 找不到 $SETUP" >&2; exit 1; }
|
[ -f "$SETUP" ] || { echo "🔴 找不到 $SETUP" >&2; exit 1; }
|
||||||
|
|
||||||
MISSING=()
|
MISSING=()
|
||||||
|
# 🔴 兩個檔分開產(2026-09-18 實撞):原本兩段放同一檔、中間用「════」分隔,
|
||||||
|
# leo 把分隔線一起貼進 Setup script 欄 ⇒ 雲端開機 exit 127「'════…': command not found」,
|
||||||
|
# 每一趟 cloud-worker 在開機就死。⇒ 變數一個檔(只有 KEY=VALUE)、開機腳本一個檔(逐位元組=cloud-setup-script.sh),
|
||||||
|
# **兩個檔都整份貼**,沒有任何要人自己裁切的地方。
|
||||||
|
SETUP_OUT="${OUT%.txt}-setup-script.sh"
|
||||||
{
|
{
|
||||||
echo "claude.ai → Cloud environments → 你的環境。下面兩塊各自貼進對應欄位。"
|
|
||||||
echo "產生時間:$(date '+%Y-%m-%d %H:%M')"
|
|
||||||
echo
|
|
||||||
echo "════════ ① Environment variables(一行一個,名字與值分開填)════════"
|
|
||||||
for n in "${NEEDED[@]}"; do
|
for n in "${NEEDED[@]}"; do
|
||||||
if v=$(lookup "$n"); then
|
if v=$(lookup "$n"); then
|
||||||
echo "$n=$v"
|
echo "$n=$v"
|
||||||
@@ -116,12 +157,20 @@ MISSING=()
|
|||||||
MISSING+=("$n")
|
MISSING+=("$n")
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
echo
|
for kv in "${FIXED[@]}"; do echo "$kv"; done
|
||||||
echo "════════ ② Setup script(整段貼,一字不改)════════"
|
|
||||||
cat "$SETUP"
|
|
||||||
} > "$OUT"
|
} > "$OUT"
|
||||||
chmod 600 "$OUT"
|
cp "$SETUP" "$SETUP_OUT"
|
||||||
|
chmod 600 "$OUT" "$SETUP_OUT"
|
||||||
|
{
|
||||||
|
echo "claude.ai → Cloud environments → 你的環境(${VER},${VER_DATE}:${VER_WHY})"
|
||||||
|
echo "比 ${PREV_VER} 多:${ADDED:-(無)}|少:${REMOVED:-(無)}"
|
||||||
|
echo "① Environment variables 欄:整份貼 $(basename "$OUT")"
|
||||||
|
echo "② Setup script 欄:整份貼 $(basename "$SETUP_OUT")(一字不改,不要加任何東西)"
|
||||||
|
echo "貼完刪掉這三個檔。"
|
||||||
|
} > "${OUT%.txt}-README.txt"
|
||||||
|
|
||||||
echo "✅ 產生完成:$OUT"
|
echo "✅ 產生完成:$OUT"
|
||||||
|
echo " 版本:${VER}(比 ${PREV_VER} 多:${ADDED:-無}|少:${REMOVED:-無})"
|
||||||
echo " 變數 ${#NEEDED[@]} 個|找不到值的 ${#MISSING[@]} 個 ${MISSING[*]:-}"
|
echo " 變數 ${#NEEDED[@]} 個|找不到值的 ${#MISSING[@]} 個 ${MISSING[*]:-}"
|
||||||
echo " 🔴 這個檔含金鑰真身:貼完就刪(rm '$OUT'),它刻意不在任何 repo 裡。"
|
echo " 開機腳本:$SETUP_OUT"
|
||||||
|
echo " 🔴 含金鑰真身:貼完就刪(rm '${OUT%.txt}'*),它刻意不在任何 repo 裡。"
|
||||||
|
|||||||
@@ -35,6 +35,7 @@ NEEDED=()
|
|||||||
while IFS= read -r l; do NEEDED+=("$l"); done < <(
|
while IFS= read -r l; do NEEDED+=("$l"); done < <(
|
||||||
sed -n '/^NEEDED=(/,/^)/p' "$S" | sed -E '1d;$d; s/[[:space:]]*#.*$//; s/[[:space:]]//g' | grep -v '^$')
|
sed -n '/^NEEDED=(/,/^)/p' "$S" | sed -E '1d;$d; s/[[:space:]]*#.*$//; s/[[:space:]]//g' | grep -v '^$')
|
||||||
[ "${#NEEDED[@]}" -gt 0 ] || { echo "🔴 從 $S 讀不出 NEEDED,測試本身壞了"; exit 1; }
|
[ "${#NEEDED[@]}" -gt 0 ] || { echo "🔴 從 $S 讀不出 NEEDED,測試本身壞了"; exit 1; }
|
||||||
|
MIRA_ALLOWED=($(sed -n 's/^MIRA_ALLOWED=(\(.*\))/\1/p' "$S"))
|
||||||
echo "清單(只有名字):${NEEDED[*]}"
|
echo "清單(只有名字):${NEEDED[*]}"
|
||||||
echo
|
echo
|
||||||
|
|
||||||
@@ -59,6 +60,19 @@ chk 0 "$miss" "A3 每個名字都帶著值出現在 ① 區塊"
|
|||||||
printf '%s\n' "$OUT_LINE" | grep -q "找不到值的 0 個" \
|
printf '%s\n' "$OUT_LINE" | grep -q "找不到值的 0 個" \
|
||||||
&& ok "A4 收尾那行說「找不到值的 0 個」" || bad "A4 收尾計數不對:$OUT_LINE"
|
&& ok "A4 收尾那行說「找不到值的 0 個」" || bad "A4 收尾計數不對:$OUT_LINE"
|
||||||
|
|
||||||
|
# 版本(leo 2026-09-18):產物檔頭帶現行版本號;清單改了沒升版要拒絕
|
||||||
|
grep -q "(v[0-9]" "${F%.txt}-README.txt" && ok "V1 README 寫著版本號" || bad "V1 README 沒有版本號"
|
||||||
|
# 2026-09-18 實撞:兩段同檔、分隔線被貼進 Setup script 欄 ⇒ 雲端開機 exit 127。分檔後兩件事要守住:
|
||||||
|
bad_lines=$(grep -cvE '^[A-Z][A-Z0-9_]*=' "$F")
|
||||||
|
chk 0 "$bad_lines" "V3 變數檔每一行都是 KEY=VALUE(沒有分隔線、說明文字)"
|
||||||
|
cmp -s "${F%.txt}-setup-script.sh" "$(cd "$(dirname "$S")/.." && pwd)/docs/cloud-setup-script.sh" \
|
||||||
|
&& ok "V4 開機腳本檔與 docs/cloud-setup-script.sh 逐位元組相同" || bad "V4 開機腳本檔被加料了"
|
||||||
|
VT="$(cd "$(dirname "$S")/.." && pwd)/docs/cloud-env-versions.tsv"; VB="$VT.bak-test"
|
||||||
|
cp "$VT" "$VB"; printf 'v999\t2099-01-01\tNOPE_ONLY\t測試用\n' >> "$VT"
|
||||||
|
INKSTONE_ROOT="$FAKE" OUT_DIR="$OUTD" bash "$S" >/dev/null 2>&1; rc=$?
|
||||||
|
mv "$VB" "$VT"
|
||||||
|
chk 2 "$rc" "V2 清單與最後一版 key 不一致時拒絕產生(離開碼 2)"
|
||||||
|
|
||||||
# 缺值時不准假綠:拿掉第一個,它要變成 <🔴 …> 且計數變 1
|
# 缺值時不准假綠:拿掉第一個,它要變成 <🔴 …> 且計數變 1
|
||||||
grep -v "^${NEEDED[0]}=" "$FAKE/.env" > "$FAKE/.env.tmp" && mv "$FAKE/.env.tmp" "$FAKE/.env"
|
grep -v "^${NEEDED[0]}=" "$FAKE/.env" > "$FAKE/.env.tmp" && mv "$FAKE/.env.tmp" "$FAKE/.env"
|
||||||
OUT2=$(INKSTONE_ROOT="$FAKE" OUT_DIR="$OUTD" bash "$S" 2>&1)
|
OUT2=$(INKSTONE_ROOT="$FAKE" OUT_DIR="$OUTD" bash "$S" 2>&1)
|
||||||
@@ -104,7 +118,7 @@ else
|
|||||||
if r=$(real_src "$n"); then
|
if r=$(real_src "$n"); then
|
||||||
len="${r%% *}"; src="${r#* }"
|
len="${r%% *}"; src="${r#* }"
|
||||||
printf ' %-38s → 找得到(長度 %s)來自 %s\n' "$n" "$len" "${src#$BASE/}"
|
printf ' %-38s → 找得到(長度 %s)來自 %s\n' "$n" "$len" "${src#$BASE/}"
|
||||||
case "$src" in */polaris/mira/.env) prod=$((prod+1)); echo " 🔴 ↑ 這是 leo21c 現役正式環境那份 .env";; esac
|
case "$src" in */polaris/mira/.env) if printf '%s\n' "${MIRA_ALLOWED[@]}" | grep -qx "$n"; then echo " 🔓 ↑ 點名放行(MIRA_ALLOWED:通知 bot,不碰 CF)"; else prod=$((prod+1)); echo " 🔴 ↑ 這是 leo21c 現役正式環境那份 .env"; fi;; esac
|
||||||
else
|
else
|
||||||
printf ' %-38s → 🔴 這台拿不到\n' "$n"; gone=$((gone+1))
|
printf ' %-38s → 🔴 這台拿不到\n' "$n"; gone=$((gone+1))
|
||||||
fi
|
fi
|
||||||
|
|||||||
Reference in New Issue
Block a user