$ file变量可直接获取当前已保存文件的绝对路径,未保存时为空字符串;需用数组形式如["python", "$file"]避免空格问题,配合$file_path和$file_name可实现更灵活构建。

构建系统里用 $file 就能拿到当前文件路径
Sublime 的构建系统支持一组内置变量,其中 $file 是最常用、也最直接的——它代表当前视图中已保存文件的**绝对路径字符串**。只要文件没保存,$file 就是空字符串,构建会失败或执行空命令,这点必须提前确认。
常见错误现象:按 Ctrl+B 后控制台一闪而过、没输出、报错 No such file or directory,大概率是因为你正编辑一个未保存的 untitled 标签页。
-
$file只在文件已保存时有效;新建标签页必须先Ctrl+S再运行 - 路径含空格或中文?没问题,Sublime 会原样代入,但传给 shell 时需确保命令以数组形式书写(见下一条)
- 不要写成
"cmd": "python $file"—— 这是字符串形式,空格会导致参数截断;必须用数组:"cmd": ["python", "$file"] - 若用
"shell": true,则可写字符串命令,但此时$file不会被自动转义,路径含空格仍可能出错
$file_path 和 $file_name 的分工很明确
单靠 $file 能跑脚本,但做更精细的构建(比如先 cd 到目录再运行、或提取文件名做日志)就得组合其他变量。它们不是可选插件功能,是 Sublime 原生支持的构建变量,无需额外安装。
-
$file_path:当前文件所在目录的绝对路径(不含文件名),结尾不带斜杠,例如/home/user/project/src -
$file_name:纯文件名+扩展名,例如main.py;不能单独用于执行,但适合拼接日志名或临时文件 - 想先切工作目录再运行?可以:
"cmd": ["sh", "-c", "cd '$file_path' && python '$file_name'"],注意单引号包裹防止空格破坏 - Windows 下慎用
cd+&&组合,建议改用 PowerShell 或直接依赖工具自身的工作目录逻辑(如python默认以$file_path为 cwd)
不同语言的构建命令写法差异就在 cmd 数组第一项
构建系统本质是调用外部命令行程序,所以语言切换只取决于你让什么解释器去执行 $file。不用改逻辑,换命令就行。
- Python:用
["python3", "$file"](推荐显式写python3,避免系统默认是 Python 2) - Node.js:
["node", "$file"];TypeScript 文件需先编译,不能直接运行.ts - Bash 脚本:
["bash", "$file"];确保脚本有#!/bin/bash且有执行权限(Linux/macOS) - Ruby:
["ruby", "$file"];Windows 用户注意 Ruby 安装路径是否在PATH中 - 如果命令找不到,别急着改
$file——先在终端里手动运行python --version或node -v确认环境可用
路径含空格时最容易踩的坑是用了字符串命令 + shell: true
很多人为了“方便”把 cmd 写成字符串,再加 "shell": true,以为能兼容所有情况。结果路径一含空格,$file 就被 shell 拆成多个参数,报错 command not found 或找不到文件。
根本原因:$file 在字符串命令里只是文本替换,shell 解析时不会自动加引号。而数组形式是 Sublime 直接把每个元素当独立参数传给进程,天然规避空格问题。
- ✅ 正确(推荐):
"cmd": ["python", "$file"]—— 空格、中文、括号全无压力 - ❌ 危险:
"cmd": "python $file", "shell": true——$file是/home/user/my script.py时,实际执行的是python /home/user/my和script.py两个参数 - ⚠️ 折中但冗余:
"cmd": ["sh", "-c", "python '$1'", "_", "$file"]—— 太绕,没必要 - 真正需要
shell: true的场景极少,比如要用管道|、重定向>或变量展开,但这些通常不该放在构建系统里做
最常被忽略的一点:构建系统生效的前提是语法高亮识别正确。如果你打开的是 app.js,但右下角显示的是 “Plain Text”,那 "selector": "source.js" 就匹配不上,构建系统不会自动启用——得先手动设置语法(Ctrl+Shift+P → Set Syntax → JavaScript)或检查文件扩展名是否被正确映射。











