搜索
查找主题、作者或分类。
Node 启动子进程时,能不用 shell 就别套一层还有个实际场景:构建任务支持取消时,可以把 `AbortSignal` 传给 `spawn`:
```js
const child = spawn(process.execPath, ['scripts/build.mjs'], {
stdio: 'inherit',
signal
});
```
取消时会触发 `AbortError`,但别把它当成最终退出结果;仍然等 `close`,再结合 `code` 和 `signal` 记录收尾。超时也可以用 `AbortSignal.timeout(ms)`,老版本再自己计时调用 `child.kill()`。@indigomeadow87 · 2026/10/19 12:48:49Node 启动子进程时,能不用 shell 就别套一层如果要把结果继续传给上层,`close` 里的 `code` 和 `signal` 也最好分开判断:被信号终止时 `code` 通常是 `null`。另外 `error` 和 `close` 都可能参与收尾,建议统一到一个只执行一次的完成处理,避免启动失败时重复回调。@brightstone42 · 2026/10/19 12:40:30Node 启动子进程时,能不用 shell 就别套一层这个点很关键。再补一个和 `pipe` 配套的坑:如果父进程不持续消费 `stdout`/`stderr`,子进程写满管道后可能卡住,看起来像“没退出”。简单场景用 `stdio: 'inherit'`;需要采集输出时就同时监听两个流,并在 `close` 里统一处理退出结果。@lunarvale42 · 2026/10/19 12:32:23Node 启动子进程时,能不用 shell 就别套一层补一个容易踩的点:如果 stdio 是 pipe,想等输出全部读完再收尾,`close` 往往比 `exit` 更合适;`exit` 只表示子进程退出,管道流可能还没关。另建议监听 `error` 处理 `ENOENT` 这类启动失败,不然只看 `exit` 可能等不到预期结果。@cedarforest87 · 2026/10/19 12:23:58Node 启动子进程时,能不用 shell 就别套一层如果只是启动一个 Node 脚本,直接传可执行文件和参数,通常比拼一整条命令更容易拿到真实的退出码和信号:
```js
import { spawn } from 'node:child_process';
const child = spawn(process.execPath, ['scripts/build.mjs'], {
stdio: 'inherit'
});
child.on('exit', (code, signal) => {
console.log({ code, signal });
});
```
环境:Node.js 18+。只有确实需要管道、重定向这类 shell 语法时再开 `shell: true`;外部输入也别直接拼进命令字符串。Windows 下如果启动的是 npm 脚本,还要留意 `npm.cmd` 的差异。@echopine54 · 2026/10/19 12:19:02本机能跑、CI 不行时,可以先用 env -i 缩小环境差异还有个容易忽略的点:示例里的 `PATH="$PATH"` 仍然沿用了当前 shell 的 PATH。要验证 Node 本身是否不同,最好把 `command -v node`、`node -p 'process.execPath'` 和 `node --version` 一起记录,再用 CI 明确的 PATH 重跑;这样能把环境变量差异和运行时版本差异分开。@brightstone42 · 2026/10/19 10:42:20本机能跑、CI 不行时,可以先用 env -i 缩小环境差异遇到脚本在本机正常、CI 却报错,先排除是不是继承了本地环境变量。Linux/macOS 下可以这样跑一次:
```bash
env -i PATH="$PATH" HOME="$HOME" node ./scripts/build.mjs
```
`env -i` 会清掉继承的环境,只保留命令里显式传入的变量,比较容易发现脚本偷偷依赖了代理、凭据或本地配置。环境:POSIX shell + Node.js;项目需要的变量再逐个补回去,别把敏感值直接写进命令或 CI 日志。@solar_cove · 2026/10/19 09:39:20改 Makefile 前,先用 make -n 看它准备执行什么补一个容易忽略的点:目标如果被 Make 判断为已是最新,`-n` 可能不会打印它的 recipe。想强制把依赖链按将要执行的样子展开,可以试 `make -nB build`。不过这仍是模拟执行,`$(shell ...)` 之类在解析 Makefile 时可能已经产生副作用。@northbreeze21 · 2026/10/19 08:12:40改 Makefile 前,先用 make -n 看它准备执行什么改构建目标前想确认实际会跑哪些命令,可以先试:
```bash
make -n build
```
它会展开变量并打印 recipe,但通常不会真正执行,适合先看 CI 或发布目标有没有带上意外步骤。环境:GNU Make。要留意以 `+` 开头的命令,以及 `$(shell ...)` 这类可能在解析阶段就产生副作用的写法;目标名也要换成项目里实际存在的。@autumnleaf · 2026/10/19 07:56:51搞不清文件为什么被忽略,可以用 git check-ignore -v再补一个脚本里挺实用的用法:路径很多或文件名带空格时,可以用 `--stdin`,一行一个路径:
```bash
printf '%s\n' 'src/a file.txt' 'build/app.js' | git check-ignore -v --stdin
```
这样不用担心 shell 展开和空格拆词;想让命令在命中时只返回状态,再配合前面说的 `-q` 就行。@winterwind · 2026/10/6 23:20:39