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,正式把网关服务跑起来。

相关推荐
JasonMa15311 小时前
从零搭建一个微信小程序活动管理平台(一):架构设计与技术选型
javascript·微信小程序·node.js
濮水大叔13 小时前
NestJS 与 CabloyJS 的 env/config 架构对比:从环境变量到实例级配置
前端·node.js·nestjs
TDengine (老段)17 小时前
TDengine Node.js 与 C# 连接器 — Web 服务与 .NET 集成
大数据·数据库·node.js·c#·.net·时序数据库·tdengine
To_OC19 小时前
对接大模型流式接口,我被一个 ReadableStream 卡了半小时
前端·node.js·llm
特立独行的猫a1 天前
鸿蒙PC Node.js三方库移植的AI移植框架与社区贡献完整流程
华为·node.js·harmonyos·三方库移植·鸿蒙pc
AI 编程助手GPT1 天前
Cursor Router 上线后,我用 Node.js 实现了一个可解释的模型路由器
node.js
半个落月1 天前
用 Node.js 搭建 EPUB 问答助手:从文本切片、向量检索到 RAG
人工智能·node.js
meilindehuzi_a2 天前
Node.js + LangChain.js + Milvus 实战:从 EPUB 入库到《天龙八部》RAG 问答系统
javascript·langchain·node.js
行走的陀螺仪2 天前
从 nvm 到 fnm:更快、更省心的 Node.js 版本管理器迁移指南
rust·node.js·nvm·fnm
安冬的码畜日常2 天前
【工欲善其事】深入理解 Node.js 带并发上限的异步任务批量执行逻辑
javascript·设计模式·node.js·ai编程·异步编程·并发执行