最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Claude Code中的BashTool-Shell命令執(zhí)行方法

  發(fā)布時間:2026-07-17 11:05:22   作者:言程序plus   我要評論
在使用 Claude Code 時,如果你想在 Bash 工具(Shell)中執(zhí)行命令,你可以通過以下幾種方式來實現(xiàn),這里我將介紹幾種常見的方法,感興趣的朋友跟隨小編一起看看吧

BashTool - Shell 命令執(zhí)行

所屬分組:工具系統(tǒng)

概述

BashTool 是 Claude Code 中最具"破壞力"也最常用的工具之一:它把模型的文本輸出直接交給系統(tǒng) shell 執(zhí)行,是模型與操作系統(tǒng)交互的"萬能鑰匙"。正因為能力強(qiáng)大,BashTool 的實現(xiàn)同時承擔(dān)了三重職責(zé)——給模型清晰的 prompt 指引、對命令輸出做格式化與安全處理、在終端里渲染出可讀的執(zhí)行過程與結(jié)果。

本工具目錄下文件眾多:BashTool.tsx 承載核心 call 與權(quán)限邏輯;prompt.ts 生成模型可見的工具描述與 Git/PR 操作長指引;utils.ts 處理命令輸出的截斷、圖片識別、cwd 重置等;UI.tsx 負(fù)責(zé)所有 React 渲染入口。配套還有 bashPermissions.tsbashSecurity.ts、shouldUseSandbox.ts、commandSemantics.ts 等安全模塊,以及底層的 utils/Shell.ts、utils/ShellCommand.ts 提供進(jìn)程執(zhí)行能力。

本文聚焦 prompt.ts、utils.ts、UI.tsx 三個核心文件,剖析 BashTool 如何在"模型友好 / 安全可控 / UI 清晰"三者之間取得平衡。

源碼位置

  • [tools/BashTool/prompt.ts](file:///e:/2026plan/AI_Lab/claude-code-sourcemap-main/restored-src/src/tools/BashTool/prompt.ts)
  • [tools/BashTool/utils.ts](file:///e:/2026plan/AI_Lab/claude-code-sourcemap-main/restored-src/src/tools/BashTool/utils.ts)
  • [tools/BashTool/UI.tsx](file:///e:/2026plan/AI_Lab/claude-code-sourcemap-main/restored-src/src/tools/BashTool/UI.tsx)
  • [tools/BashTool/BashTool.tsx](file:///e:/2026plan/AI_Lab/claude-code-sourcemap-main/restored-src/src/tools/BashTool/BashTool.tsx)
  • [utils/Shell.ts](file:///e:/2026plan/AI_Lab/claude-code-sourcemap-main/restored-src/src/utils/Shell.ts)

核心實現(xiàn)分析

1. prompt.ts:分層組裝的工具描述

getSimplePrompt() 是 BashTool 注入到 system prompt 的主體文本。它的構(gòu)造方式很特別——不是單塊字符串,而是由多個獨立函數(shù)拼接而成,每一層負(fù)責(zé)一類關(guān)注點:

  • 工具偏好層:明確告訴模型哪些操作應(yīng)該用專用工具而非 Bash(File search: Use Glob、Read files: Use FileReadTool 等)。這層策略直接降低模型誤用 Bash 做文件操作的幾率。
  • 指令層:處理多條命令的并行/串行規(guī)則、git 命令的安全約束、sleep 命令的反模式警告。
  • 沙箱層getSimpleSandboxSection() 注入文件系統(tǒng)/網(wǎng)絡(luò)沙箱的運行時配置。
  • Git/PR 層getCommitAndPRInstructions() 是一段非常長的內(nèi)嵌指引,覆蓋 commit 流程、PR 創(chuàng)建、git 安全協(xié)議。

值得注意的是工具偏好與 avoidCommands 的動態(tài)生成:

const avoidCommands = embedded
  ? '`cat`, `head`, `tail`, `sed`, `awk`, or `echo`'
  : '`find`, `grep`, `cat`, `head`, `tail`, `sed`, `awk`, or `echo`'

當(dāng) ant 原生構(gòu)建把 find/grep 別名到內(nèi)嵌的 bfs/ugrep 時,prompt 主動讓模型使用這些命令;否則勸阻。這是 prompt 與運行時環(huán)境雙向適配的典型例子。

2. 沙箱配置的 token 優(yōu)化

getSimpleSandboxSection() 在注入沙箱配置前會做一道去重處理:

// SandboxManager merges config from multiple sources (settings layers, defaults,
// CLI flags) without deduping, so paths like ~/.cache appear 3× in allowOnly.
// Dedup here before inlining into the prompt — affects only what the model sees,
// not sandbox enforcement. Saves ~150-200 tokens/request when sandbox is enabled.
function dedup<T>(arr: T[] | undefined): T[] | undefined {
  if (!arr || arr.length === 0) return arr
  return [...new Set(arr)]
}

注釋揭示了細(xì)節(jié):SandboxManager 把多層 settings 合并但不去重,導(dǎo)致 ~/.cache 這樣的路徑在 allowOnly 中出現(xiàn)三次。這里去重只影響模型看到的文本(不影響實際沙箱執(zhí)行),每次請求節(jié)省約 150-200 tokens。還有一處把 per-UID 臨時目錄(如 /private/tmp/claude-1001/)歸一化為 $TMPDIR,“避免破壞跨用戶的全局 prompt cache”。

3. dangerouslyDisableSandbox 的兩套策略

getSimpleSandboxSection() 根據(jù) allowUnsandboxedCommands 輸出兩套截然不同的指引。當(dāng)允許越獄時:

'You should always default to running commands within the sandbox. Do NOT attempt to set `dangerouslyDisableSandbox: true` unless:',
// ...
"When you see evidence of sandbox-caused failure:",
[
  "Immediately retry with `dangerouslyDisableSandbox: true` (don't ask, just do it)",
  'Briefly explain what sandbox restriction likely caused the failure...',
  'This will prompt the user for permission',
],

策略是"看到沙箱失敗證據(jù)就立即重試并解釋"——既不讓模型反復(fù)糾纏用戶,又保留了 audit trail。而不允許越獄時則是硬性約束:“Commands cannot run outside the sandbox under any circumstances.”

4. Git 安全協(xié)議的 fail-safe 設(shè)計

getCommitAndPRInstructions() 中嵌入了大量"NEVER"約束:

- NEVER update the git config
- NEVER run destructive git commands (push --force, reset --hard, checkout ., restore ., clean -f, branch -D) unless...
- NEVER skip hooks (--no-verify, --no-gpg-sign, etc) unless...
- NEVER run force push to main/master, warn the user if they request it
- CRITICAL: Always create NEW commits rather than amending, unless the user explicitly requests a git amend...

特別值得品味的是"amend"那條的注釋:當(dāng) pre-commit hook 失敗時,commit 實際并未發(fā)生,此時若 --amend 會修改前一次提交,可能毀掉前一次的工作。模型很容易踩這個坑,所以用 CRITICAL 標(biāo)記并給出替代流程(fix issue → re-stage → create NEW commit)。

5. utils.ts:命令輸出的多形態(tài)處理

formatOutput() 是 utils.ts 中最關(guān)鍵的函數(shù)之一,它要處理兩類截然不同的輸出——純文本與圖片 data URI:

export function formatOutput(content: string): {
  totalLines: number
  truncatedContent: string
  isImage?: boolean
} {
  const isImage = isImageOutput(content)
  if (isImage) {
    return { totalLines: 1, truncatedContent: content, isImage }
  }
  const maxOutputLength = getMaxOutputLength()
  if (content.length <= maxOutputLength) {
    return { totalLines: countCharInString(content, '\n') + 1, truncatedContent: content, isImage }
  }
  const truncatedPart = content.slice(0, maxOutputLength)
  const remainingLines = countCharInString(content, '\n', maxOutputLength) + 1
  const truncated = `${truncatedPart}\n\n... [${remainingLines} lines truncated] ...`
  // ...
}

isImageOutput() 用正則匹配 data:image/...;base64, 前綴;命中后內(nèi)容直接透傳給 buildImageToolResult() 轉(zhuǎn)成 Anthropic SDK 的 image block。這種"shell 命令直接吐出圖片"的能力讓模型可以運行 matplotlib 腳本后立即看到結(jié)果。

6. 圖片輸出的尺寸壓縮

resizeShellImageOutput() 解決了一個微妙的問題——shell stdout 被截斷到 getMaxOutputLength() 時,截斷的 base64 會解碼成損壞的圖片。函數(shù)會從 spill 文件重新讀取完整內(nèi)容,再做尺寸壓縮:

// Caps dimensions too: compressImageBuffer only checks byte size, so
// a small-but-high-DPI PNG (e.g. matplotlib at dpi=300) sails through at full
// resolution and poisons many-image requests (CC-304).
const resized = await maybeResizeAndDownsampleImageBuffer(buf, buf.length, ext)

注釋里的 CC-304 是真實案例——高 DPI PNG 雖然字節(jié)數(shù)小但分辨率高,會在多圖請求中"中毒"。這里強(qiáng)制下采樣避免該問題。MAX_IMAGE_FILE_SIZE 設(shè)為 20MB,超過直接返回 null(讓調(diào)用方回退到文本處理)。

7. cwd 重置機(jī)制

resetCwdIfOutsideProject() 是 BashTool 在每次調(diào)用后保護(hù)工作目錄一致性的關(guān)鍵:

export function resetCwdIfOutsideProject(
  toolPermissionContext: ToolPermissionContext,
): boolean {
  const cwd = getCwd()
  const originalCwd = getOriginalCwd()
  const shouldMaintain = shouldMaintainProjectWorkingDir()
  if (
    shouldMaintain ||
    (cwd !== originalCwd &&
      !pathInAllowedWorkingPath(cwd, toolPermissionContext))
  ) {
    setCwd(originalCwd)
    if (!shouldMaintain) {
      logEvent('tengu_bash_tool_reset_to_original_dir', {})
      return true
    }
  }
  return false
}

注意 fast path:當(dāng) cwd 沒變(cwd === originalCwd)時直接跳過 pathInAllowedWorkingPath 的系統(tǒng)調(diào)用——因為 originalCwd 一定在允許的工作目錄里。這是高頻路徑的優(yōu)化。當(dāng) cwd 漂出允許目錄時,自動重置并打點上報。

8. UI.tsx:渲染入口與 sed 編輯特例

renderToolUseMessage() 處理工具調(diào)用氣泡。它對 sed -i 這類原地編輯做了特例:

export function renderToolUseMessage(input, { verbose, theme: _theme }) {
  const { command } = input
  if (!command) return null
  // Render sed in-place edits like file edits (show file path only)
  const sedInfo = parseSedEditCommand(command)
  if (sedInfo) {
    return verbose ? sedInfo.filePath : getDisplayPath(sedInfo.filePath)
  }
  // ...
}

parseSedEditCommand()sed -i 's/foo/bar/' file.txt 識別成文件編輯操作,UI 上就只顯示文件路徑——視覺上等同于 FileEditTool,讓用戶一眼看出"這是一次文件修改"而不是"一條 shell 命令"。這是 UI 把語義還原為意圖的范例。

9. 命令顯示的截斷策略

非 verbose 模式下命令顯示有兩道截斷:

const MAX_COMMAND_DISPLAY_LINES = 2
const MAX_COMMAND_DISPLAY_CHARS = 160
if (!verbose) {
  const lines = command.split('\n')
  if (isFullscreenEnvEnabled()) {
    const label = extractBashCommentLabel(command)
    if (label) { /* 用注釋作為 label */ }
  }
  const needsLineTruncation = lines.length > MAX_COMMAND_DISPLAY_LINES
  const needsCharTruncation = command.length > MAX_COMMAND_DISPLAY_CHARS
  if (needsLineTruncation || needsCharTruncation) {
    // 先按行截,再按字符截
  }
}

extractBashCommentLabel() 在全屏模式下會提取命令開頭的注釋(如 # run tests\npytest)作為 label 顯示——這是給"用注釋標(biāo)注意圖"的命令風(fēng)格的獎勵。

10. BackgroundHint 與 ctrl+b 后臺化

BackgroundHint 組件讓用戶能把前臺運行中的命令一鍵后臺化:

export function BackgroundHint({ onBackground }) {
  // ...
  useKeybinding("task:background", handleBackground, { context: "Task" })
  const baseShortcut = useShortcutDisplay("task:background", "Task", "ctrl+b")
  const shortcut = env.terminal === "tmux" && baseShortcut === "ctrl+b"
    ? "ctrl+b ctrl+b (twice)"
    : baseShortcut
  // ...
}

注意 tmux 環(huán)境下的特殊處理——tmux 默認(rèn)前綴鍵也是 ctrl+b,所以提示用戶要按兩次。這種"環(huán)境感知的快捷鍵提示"是細(xì)節(jié)控的體現(xiàn)。backgroundAll() 真正執(zhí)行后臺化,把所有前臺命令轉(zhuǎn)成 LocalShellTask。

11. 進(jìn)度與結(jié)果的渲染分工

renderToolUseProgressMessageShellProgressMessage 組件展示實時輸出(帶 elapsedTime、totalBytes、timeoutMs 等);renderToolResultMessageBashToolResultMessage 展示最終結(jié)果,超時信息從最后一條 progress 中提?。?/p>

export function renderToolResultMessage(content, progressMessagesForMessage, { verbose, theme, tools, style }) {
  const lastProgress = progressMessagesForMessage.at(-1)
  const timeoutMs = lastProgress?.data?.timeoutMs
  return <BashToolResultMessage content={content} verbose={verbose} timeoutMs={timeoutMs} />
}

renderToolUseQueuedMessage 簡短地顯示"Waiting…"——當(dāng)工具排隊等鎖時給用戶即時反饋。

12. 與 Shell.ts/ShellCommand.ts 的關(guān)系

utils.ts 直接調(diào)用了 setCwd from utils/Shell.ts。BashTool 的核心 call 實現(xiàn)在 BashTool.tsx 中通過 ShellCommand 抽象執(zhí)行命令——ShellCommand 處理進(jìn)程派生、stdout/stderr 流捕獲、超時、kill 信號等底層細(xì)節(jié),讓 BashTool 可以專注業(yè)務(wù)邏輯(權(quán)限、沙箱決策、輸出后處理)。這種"高層工具 + 低層 Shell 抽象"的分層讓 PowerShellTool 可以復(fù)用同一套 Shell 基礎(chǔ)設(shè)施。

關(guān)鍵設(shè)計要點

  1. prompt 分層生成getSimplePrompt 由工具偏好、指令、沙箱、Git/PR 四層函數(shù)拼接,每層獨立可演化,沙箱配置還能 token 優(yōu)化去重。
  2. 環(huán)境雙向適配:embedded search tools、tmux 終端、ant 用戶類型等環(huán)境差異都會反映到 prompt 文本和 UI 提示里,避免"一刀切"的失配。
  3. 輸出多形態(tài)識別formatOutput + isImageOutput + resizeShellImageOutput 讓 Bash 輸出能優(yōu)雅處理純文本、圖片 data URI、超大輸出三類形態(tài)。
  4. sed 編輯的 UI 還原parseSedEditCommandsed -i 視為文件編輯操作,UI 上只顯示文件路徑,把"shell 命令"還原為"文件修改"的語義。
  5. Git 安全協(xié)議 fail-safe:amend、destructive ops、skip hooks 等危險操作都有"NEVER… unless"約束,并在 pre-commit hook 失敗場景給出明確替代流程。

與其他模塊的關(guān)系

  • Shell.ts / ShellCommand.ts:提供進(jìn)程派生與流管理,BashTool 在其之上構(gòu)建權(quán)限/沙箱/輸出處理邏輯。
  • SandboxManagerutils/sandbox/sandbox-adapter.ts 提供 getFsReadConfig、getFsWriteConfig、getNetworkRestrictionConfig 等,BashTool 的 prompt 把這些配置內(nèi)聯(lián)給模型看,運行時由 sandbox 在進(jìn)程層強(qiáng)制執(zhí)行。
  • permissions 系統(tǒng)bashPermissions.tsbashSecurity.ts、commandSemantics.tsdestructiveCommandWarning.ts 共同決定一條命令是否需要用戶確認(rèn);shouldUseSandbox.ts 決定是否進(jìn)入沙箱模式。
  • tasks/LocalShellTaskbackgroundAll 把前臺命令轉(zhuǎn)后臺任務(wù),由任務(wù)系統(tǒng)統(tǒng)一調(diào)度與通知。
  • FileEditTool/FileReadTool:BashTool 的 prompt 主動引導(dǎo)模型使用這些專用工具,sed 解析又把 sed 編輯在 UI 上對齊到 FileEdit 體驗,形成閉環(huán)。

小結(jié)

BashTool 是"用 prompt 寫運行時規(guī)則、用 utils 做輸出兜底、用 UI 還原操作語義"的集大成者。它的 prompt.ts 不是簡單文本,而是分層組裝、token 優(yōu)化、環(huán)境感知的運行時策略;utils.ts 同時處理文本截斷、圖片解碼、cwd 保護(hù)三件不同的事;UI.tsx 把 sed -i 渲染成文件編輯、把 ctrl+b 后臺化做成 tmux 兼容。理解 BashTool 的設(shè)計哲學(xué),就能理解 Claude Code 工具系統(tǒng)在"模型可控性、運行時安全、用戶體驗"三角上的取舍方式。

到此這篇關(guān)于Claude Code中的BashTool-Shell命令執(zhí)行方法的文章就介紹到這了,更多相關(guān)Claude Code BashTool-Shell命令執(zhí)行內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持腳本之家!

相關(guān)文章

  • Claude Code 完全實戰(zhàn)指南CLI 命令大全(推薦)

    在軟件開發(fā)和編程領(lǐng)域,命令行界面(CLI)是一個非常重要的工具,它允許開發(fā)者通過文本命令來控制計算機(jī)系統(tǒng),本文介紹Claude Code 完全實戰(zhàn)指南CLI 命令大全的相關(guān)知識,
    2026-06-04
  • Claude Code中斜杠命令的使用教程,效率翻10倍!

    其實 Claude Code 內(nèi)置了很多斜杠命令,輸入/就能看到完整的命令列表,這些命令覆蓋了會話管理、上下文控制、并行協(xié)作等方方面面,用好了能省很多事,下面小編就和大家詳細(xì)
    2026-06-03
  • Claude Code指令超詳細(xì)入門教程(含照抄的例子)

    Claude Code是Anthropic推出的AI編程助手,運行在終端中,能通過自然語言幫你編寫、調(diào)試和管理代碼,這篇文章主要介紹了Claude Code指令超詳細(xì)入門的相關(guān)資料,文中通過圖文介
    2026-06-01
  • Claude Code工作流中的命令實現(xiàn)與自定義指南

    本文基于 claude-code-rev 源碼分析 Claude Code 工作流中的命令系統(tǒng):命令從哪里加載、如何被識別、如何執(zhí)行、能否自定義、如何編寫自定義命令/技能,以及這些命令與模型
    2026-05-26
  • 一問詳解Claude Code中的調(diào)試技巧與錯誤處理

    這篇文章主要為大家詳細(xì)介紹了 Claude Code 的調(diào)試技巧、錯誤分析方法、日志解讀、性能優(yōu)化策略以及常見問題的解決方案,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小
    2026-04-24
  • 2026年Claude Code常用命令速查

    Claude Code 是 Anthropic 官方推出的命令行 AI 編程助手,支持代碼生成、調(diào)試、重構(gòu)、項目分析、文件讀寫等強(qiáng)大的 Agent 能力,本文為大家整理了claude code的一些常用命令
    2026-06-09
  • Claude Code命令速查大全

    2026年的AI編程工具市場,Claude Code已經(jīng)穩(wěn)穩(wěn)坐上了頭把交椅,今天,我就從最基礎(chǔ)的安裝開始,一步步帶你掌握Claude Code的全部命令,希望這篇文章能夠幫到你
    2026-04-22
  • Claude Code 命令使用完整流程(進(jìn)階版)

    Claude是一款專為開發(fā)者設(shè)計的AI編程操作系統(tǒng),旨在提升AI使用效率、減少試錯成本,通過核心命令如項目初始化、自我優(yōu)化等,幫助用戶建立項目上下文、優(yōu)化使用方式,推薦開發(fā)流
    2026-04-15
  • Claude Code CLI命令使用小結(jié)

    Claude Code 是 Anthropic 官方推出的命令行工具,讓開發(fā)者能在終端中與 Claude 進(jìn)行交互,本文就來詳細(xì)的介紹一下Claude Code CLI命令使用,感興趣的可以了解一下
    2026-04-13

最新評論

仁怀市| 内江市| 花莲县| 昌图县| 桑日县| 克东县| 卫辉市| 咸阳市| 渑池县| 锦屏县| 禹城市| 惠来县| 甘肃省| 南康市| 鸡东县| 博爱县| 繁昌县| 精河县| 柳河县| 玛纳斯县| 离岛区| 衡山县| 武汉市| 三门县| 东城区| 保定市| 太原市| 东丽区| 武功县| 虹口区| 伊宁市| 苏州市| 新绛县| 安宁市| 惠安县| 嘉荫县| 比如县| 突泉县| 黔江区| 巴东县| 玉门市|