在 macOS 上,想让 shell 脚本双击执行,通常把脚本文件后缀改成:
.command
例如:
run.sh → run.command
然后给它执行权限:
chmod +x run.command
之后就可以在 Finder 里双击执行。
推荐脚本模板
#!/bin/zsh # 自动切换到脚本所在目录 cd "$(dirname "$0")" || exit 1 echo "当前目录:$(pwd)" # 你的命令写在这里 echo "开始执行..." # 防止窗口一闪而过 echo "执行完成" read "?按回车退出..."
如果你用的是 bash,也可以写:
#!/bin/bash cd "$(dirname "$0")" || exit 1 echo "当前目录:$(pwd)" # 你的命令 echo "Hello" read -p "按回车退出..."
关键点解释
1. 双击执行
macOS Finder 里双击 .sh 文件,通常会用编辑器打开。
但 .command 文件双击时,会自动用 Terminal 执行。
所以文件名建议改成:
xxx.command
2. 自动切换到脚本所在目录
核心是这一句:
cd "$(dirname "$0")" || exit 1
含义是:进入当前脚本所在的文件夹。
这样你双击脚本时,不管 Terminal 默认打开在哪里,脚本都会先切换到自己的目录。
例如目录结构是:
MyTool/ ├── run.command ├── config.txt └── data/
你的脚本里可以直接写:
cat config.txt ls data
不会因为双击执行时工作目录不对而找不到文件。
更稳妥的写法
如果你的路径里可能有中文、空格,推荐用这个版本:
#!/bin/zsh SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" cd "$SCRIPT_DIR" || exit 1 echo "脚本所在目录:$SCRIPT_DIR" # 你的命令
如果双击提示权限不足
执行:
chmod +x /完整路径/run.command
例如:
chmod +x ~/Desktop/run.command
如果提示无法打开,来自未认证开发者或被系统拦截
确认脚本安全后,可以执行:
xattr -d com.apple.quarantine /完整路径/run.command
例如:
xattr -d com.apple.quarantine ~/Desktop/run.command
最小可用示例
保存为 run.command:
#!/bin/zsh cd "$(dirname "$0")" || exit 1 echo "我现在在脚本目录:" pwd ls read "?按回车退出..."
然后执行一次:
chmod +x run.command
以后双击 run.command 就能运行,并且会自动切换到脚本所在目录。