Shell 脚本语言(Bash/Sh)基础 与 应用

目录

[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 #)

举例:Node.js

【项目】环境参数、变量:多环境本地开发配置

【系统】终端:Gateway(网关)服务


Shell 脚本语言(Bash/Sh)基础

man test 查看完整文档(Linux/Mac)

连接符:执行条件

连接符 执行条件 示例
换行 前者结束则执行后者 cmd1 cmd2
&& 前一个成功 make && make install
` `
& 后台运行前者,异步执行,不等待执行结束 server & client
  • 关键步骤用 && 确保依赖关系

  • 容错场景用 || 提供备选方案

  • 后台任务用 & 但需要配合 waitsleep

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.logprint

echo "Hello World" # 输出: Hello World

echo "错误信息" >&2 # 输出到错误流

echo -n "不换行" # -n 参数不换行

echo $VAR # 输出变量值

pwdPrint 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(网关)服务

run.sh

.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
  1. 加载环境: 寻找并加载 NVM(Node Version Manager),确保终端可以使用 nvm 命令。

  2. 切换目录: cd ../../ 让终端向上跳两级目录(去到项目的根目录)。

  3. 切换 Node 版本: nvm use 22 自动把当前 Node.js 环境切换到大版本 22。

  4. 注入环境变量并运行: 后面那一长串是大写字母的是环境变量 ,用来临时改变程序的行为,最后用 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,正式把网关服务跑起来。

相关推荐
weifengma-wish3 小时前
通过NPM安装claude code
前端·npm·node.js
不总是13 小时前
Windows 系统 Node.js 免安装版(zip)安装与配置教程(2026 最新)
前端·windows·node.js
蓝乐20 小时前
Express 知识点总结
node.js·express
kylinmin1 天前
Node.js安装及环境配置超详细教程(以win11为例子)
node.js
阿奇__1 天前
基于 Node.js 与智谱 AI 的 RAG 工程实践
人工智能·node.js
hacker_LeeFei1 天前
前端辨识:npx、npm 、pnpm的区别
前端·npm·node.js
草明1 天前
检查 node.js 项目中的漏洞
node.js·漏洞·audit
前端程序猿i1 天前
PM2 使用详解:Node.js 项目后台运行、守护进程、日志与生产部署
node.js·pm2
m0_535817551 天前
从0到1上手Claude Code:Windows安装+88api配置全流程
windows·gpt·node.js·claude·claudecode·88api