vscode本身不运行shell脚本,失败主因是三件事未做:shebang错误(需首行#!/usr/bin/env bash无bom)、未执行chmod +x ./script.sh赋权、code runner默认用/bin/sh执行导致bash语法报错。

VSCode 本身不运行 Shell 脚本,点“运行”没反应、报 Permission denied 或 [[ not found,基本都卡在三件事上:#!/usr/bin/env bash 没写对、没执行 chmod +x ./script.sh、没在终端里用 bash script.sh 或 ./script.sh 显式调用。
为什么 Ctrl+Alt+N(Code Runner)没反应或报错
Code Runner 默认用 /bin/sh -c 执行 .sh 文件,但你的脚本大概率用了 Bash 特有语法(比如 [[ ]]、source、数组、$(( ))),而 /bin/sh 不支持这些——结果就是静默失败、输出空行,或直接报 line 5: [[: not found。
- 临时验证:在 VSCode 集成终端(
Ctrl+`)里手动运行bash script.sh,如果能跑,说明就是解释器错配 - 别改
$fullFileName:它可能含空格或特殊字符,$fileName更安全 - 若脚本依赖
~/.bashrc里的alias或函数,得显式source ~/.bashrc && $fileName - 改法(仅限 Linux/macOS):在设置里搜
code-runner.executorMap,把shellscript对应值改成:"bash -c 'cd $dir && source ~/.bashrc; bash $fileName'"
shebang 必须是第一行且无 BOM
VSCode 不会校验 shebang 是否合法,也不会帮你删掉隐藏字符。哪怕前面有一个空格、一个 UTF-8 BOM 或注释行,系统都会忽略它,退回到用 /bin/sh 执行,Bash 语法立刻崩。
- 检查方式:终端里运行
head -n1 script.sh | cat -A,看到^M或M-oM-?M-就是 BOM;看到#前有空格就说明不对 -
#!/bin/bash在 macOS Catalina+、Alpine、某些 Docker 镜像里会报No such file or directory,因为 bash 实际在/usr/bin/bash -
#!/usr/bin/env bash是唯一跨平台兼容写法:它通过$PATH查找bash,几乎所有 Unix-like 系统都支持
必须手动 chmod +x,VSCode 绝不会自动加
Linux/macOS 要求脚本有执行权限才能用 ./script.sh 运行。VSCode 是编辑器,不是文件管理器,它既不提示、也不帮你加权限。你保存完脚本,不敲命令,./ 方式永远报 Permission denied。
- 保存后,在集成终端中执行:
chmod +x ./script.sh(注意是./开头,不是script.sh) - 之后才能安全运行:
./script.sh;如果仍报错,优先用bash script.sh排查 - Windows 用户注意:纯 PowerShell / CMD 不认
.sh;WSL 下完全可用,但要确保 WSL 中的locale是 UTF-8(locale命令看LANG)
Windows 下必须走 WSL,别硬试 Git Bash
Windows 原生不支持 bash 解释器,也默认没有 chmod 或 shebang 机制。真正能跑起来,靠的是你主动选对执行环境,而不是点“运行”按钮。
- 必须用 WSL(Windows Subsystem for Linux):这是目前最稳定、最接近原生 Linux 的方式。安装 WSL2 + 任一发行版(如 Ubuntu),并在 VSCode 中安装
Remote - WSL扩展 - VSCode 需打开 WSL 文件系统中的项目(路径形如
/home/username/project/),而非 Windows 盘(C:) - 不要改
code-runner.executorMap让它去调用 Windows 下的 Git Bash 或 MSYS2 —— 路径空格、环境变量缺失、TTY 不兼容问题极多 - 即使强行指定
"shellscript": "C:\Program Files\Git\bin\bash.exe -c '$fullFileName',也会因 Windows 路径转义、工作目录错位而失败
真正容易被忽略的是:VSCode 从不介入文件权限和解释器选择,它只负责把命令发给终端。所有“点一下就跑”的预期,都建立在你已手动完成权限、shebang、终端类型这三项确认的基础上——少一个,./script.sh 就只是个普通文本文件。











