目录
[Shell 脚本语言(Bash/Sh)基础](#Shell 脚本语言(Bash/Sh)基础)
[man test 查看完整文档(Linux/Mac)](#man test 查看完整文档(Linux/Mac))
[wait vs sleep](#wait vs sleep)
[PID = Process ID:进程ID](#PID = Process ID:进程ID)
[echo ≈ print](#echo ≈ print)
[pwd (Print Working Directory ):打印当前工作目录](#pwd (Print Working Directory ):打印当前工作目录)
[#! vs #](#! vs #)
Shell 脚本语言(Bash/Sh)基础
man test查看完整文档(Linux/Mac)
连接符:执行条件
| 连接符 | 执行条件 | 示例 |
|---|---|---|
| 换行 | 前者结束则执行后者 | cmd1 cmd2 |
&& |
前一个成功 | make && make install |
| ` | ` | |
& |
后台运行前者,异步执行,不等待执行结束 | server & client |
-
关键步骤用
&&确保依赖关系 -
容错场景用
||提供备选方案 -
后台任务用
&但需要配合wait或sleep
wait vs sleep
sleep time #等time秒
wait $PID # 等进程结束
PID = Process ID:进程ID
javascript
$$ # 当前 Shell 的 PID
$! # 最后一个后台进程的 PID
$? # 上一个命令的退出码(0=成功)
ps aux | grep node # 可以看到所有进程和 PID
kill 12345 # 通过 PID 杀死进程
echo $! # 输出刚启动的进程 PID
echo ≈ print
输出内容到终端 (类似 console.log 或 print)
echo "Hello World" # 输出: Hello World
echo "错误信息" >&2 # 输出到错误流
echo -n "不换行" # -n 参数不换行
echo $VAR # 输出变量值
pwd (Print Working Directory ):打印当前工作目录
#! vs
-
普通
#开头的行 → 注释,完全忽略 -
第一行的
#!→ Shebang,告诉系统用哪个程序执行脚本
javascript
#!/usr/bin/env zsh
#指定zsh执行
举例:Node.js
在 Node.js 项目中,package.json 里的 "scripts" 对象就是一个"快捷键映射表"。
javascript
{
"main": "index.js",
"scripts": {
"start": "node index.js",
"setup": "node setup.js",
"report": "node weeklyReport.js",
"sync": "npm run setup && npm run start && npm run report"
},
npm run start (简写为 npm start)是一个快捷命令(别名) 。npm 就会在后台执行真正的命令:node index.js (即运行项目根目录下的 index.js 文件)。
【项目】环境参数、变量:多环境本地开发配置
javascript
"scripts": {
"dev:test": "cross-env BUILD_ENV=test NODE_OPTIONS=--openssl-legacy-provider webpack-dev-server --inline --progress --config build/webpack.dev.conf.js",
}
-
cross-env:这是一个跨平台的工具。因为 Windows 和 Mac/Linux 设置环境变量的语法不一样,用它能保证在所有电脑上都能成功设置后面的变量。 -
BUILD_ENV=test / sandbox / prod:唯一的变量! 运行在测试环境/沙箱环境/生产环境,调对应环境的后端接口 API。" -
NODE_OPTIONS=--openssl-legacy-provider:这是一个兼容性补丁。说明你的项目较老(比如 Webpack 3/4),而你电脑的 Node.js 版本较新(Node 17+),不加这一句项目会直接报错崩掉。 -
webpack-dev-server --config ...:这是真正干活的启动命令。利用 Webpack 启动一个本地开发服务器(支持热更新,代码改了浏览器自动刷新)。
【系统】终端:Gateway(网关)服务
.sh是 Shell 脚本(Shell Script)的标准文件扩展名。 不过需要说明的是,虽然后缀是.sh,但具体用什么 Shell 解释器执行,取决于脚本内部第一行(Shebang)。比如你这个脚本的第一行是:
#!/usr/bin/env zsh这代表它实际上指定了用
zsh来执行,而不是最古老的sh或常见的bash。
javascript
#!/usr/bin/env zsh
# Load nvm
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
# 使用子 Shell 执行,确保执行完(或中断后)回到原目录
cd ../../ && nvm use 22 && PNPM_CONFIG_BLOCK_EXOTIC_SUBDEPS=false OPENCLAW_FORCE_BUILD=1 PROJECT_MOCK_AUTH=1 node scripts/run-node.mjs gateway
-
加载环境: 寻找并加载 NVM(Node Version Manager),确保终端可以使用
nvm命令。 -
切换目录:
cd ../../让终端向上跳两级目录(去到项目的根目录)。 -
切换 Node 版本:
nvm use 22自动把当前 Node.js 环境切换到大版本 22。 -
注入环境变量并运行: 后面那一长串是大写字母的是环境变量 ,用来临时改变程序的行为,最后用
node执行了核心脚本。
-
PNPM_CONFIG_BLOCK_EXOTIC_SUBDEPS=false:允许 pnpm 安装或使用一些非标准的依赖项。 -
OPENCLAW_FORCE_BUILD=1:强制重新编译/构建 OpenClaw(可能涉及一些 C++ 原生模块或前端资源)。 -
PROJECT_MOCK_AUTH=1:开启"PROJECT"服务的 Mock(模拟)身份验证,研发阶段不需要真的去走登录鉴权流程。 -
node scripts/run-node.mjs gateway:用 Node 运行run-node.mjs脚本,并传入参数gateway,正式把网关服务跑起来。