搜索
查找主题、作者或分类。
Shell 脚本里的临时文件,最好让 trap 负责清理再补一个容易漏的点:临时目录里如果可能放配置或接口响应,脚本开头可以加 `umask 077`,避免新建文件默认对同组或其他用户可读:
```bash
umask 077
tmpdir=$(mktemp -d "${TMPDIR:-/tmp}/my-script.XXXXXX") || exit 1
```
`mktemp` 会随机命名,但权限策略还是受当前 `umask` 影响;Bash 4+、Linux 和 macOS 都能用。@north_shore · 2026/10/25 22:51:26Shell 脚本里的临时文件,最好让 trap 负责清理写脚本处理导出文件、锁文件这类临时内容时,直接写固定路径容易互相覆盖。`mktemp` 配合 `trap` 会稳一点:
```bash
#!/usr/bin/env bash
set -euo pipefail
tmp=$(mktemp)
trap 'rm -f -- "$tmp"' EXIT
printf '%s\n' "待处理内容" >"$tmp"
# 在这里读取 "$tmp" 做后续处理
cat "$tmp"
```
脚本正常结束、报错退出或收到常见信号时,都会尝试清掉临时文件;`mktemp` 也能避免多个进程撞上同一个文件名。环境是 Bash 4+、Linux/macOS。要保留失败现场的话,可以在 `trap` 里先判断退出状态,再决定是否删除。@violetmoon87 · 2026/10/25 21:46:54要同时改两个分支时,可以试试 git worktree需要一边修线上分支,一边继续做新功能时,我一般会用 `git worktree`,不用反复 stash:
```bash
git worktree add ../app-hotfix hotfix
git worktree add ../app-feature -b feature/login
git worktree list
```
这样两个目录共用同一个 Git 对象库,但各自有工作区和当前分支。改完后可以这样清理:
```bash
git worktree remove ../app-hotfix
```
环境:Git 2.x,Linux、macOS、Windows 都能用。注意同一个分支不能同时被两个 worktree 检出;删除目录前最好用 `git worktree remove`,让 Git 同步清理记录。@echopine54 · 2026/10/25 12:59:52提交前想抓多余空格,可以先跑 git diff --check有时改完代码才发现行尾多了空格,或者新增空行里混进了空白字符。提交前可以先看一下:
```bash
git diff --check
```
它会检查当前工作区相对索引的 diff,并标出带空白错误的文件和行号;只检查、不修改文件。要检查已经暂存的内容,可以看暂存区和当前提交的差异:
```bash
git diff --cached --check
```
环境:Git 2.x,Linux、macOS 和 Windows Git Bash 都能用。它主要查空格类问题,不会替代编译或测试。@autumnleaf · 2026/10/25 12:20:07CI 里用 curl 检查接口时,可以保留错误响应体有些 CI 里只写 `curl -f`,接口返回 400/500 时退出码有了,但响应体被丢掉,定位起来挺难。curl 7.76+ 可以这样:
```bash
curl --fail-with-body -sS \
-o response.json \
-w '\nHTTP %{http_code}\n' \
https://example.com/health
```
`--fail-with-body` 遇到 400 及以上状态码仍返回非 0,但会把响应体留在 `response.json`;`-sS` 安静运行、出错时仍显示错误,`-w` 只打印状态行。
环境:curl 7.76+,Linux 或 macOS。真实项目里别把令牌直接写进命令或 CI 日志。@echopine54 · 2026/10/25 11:15:19不确定 Makefile 会执行什么时,先用 make -n 看展开结果Makefile 里变量和依赖一多,直接跑目标有点不放心时,可以先看它准备执行的命令:
```bash
make -n build
```
`-n`(`--just-print`)只打印配方,不真正执行,排查变量展开、依赖顺序和路径拼接都挺方便。想看默认目标就直接运行 `make -n`。
不过它不是完全隔离的沙盒:带 `$(shell ...)` 的展开、递归 make,或者以 `+` 标记的命令仍可能有例外,里面有副作用时要留意。
环境:GNU Make 4.x,Linux 或 macOS。@echopine54 · 2026/10/25 06:09:36Git hook 明明存在却不执行,先查 core.hooksPath如果 `.git/hooks/pre-commit` 看着在,但提交时完全没反应,先别急着重装 hook。Git 可能被仓库或全局配置改了 hooks 目录:
```bash
git config --show-origin --get core.hooksPath
git rev-parse --git-path hooks
```
第一条能看到配置来自哪个文件,第二条会给出当前仓库实际使用的 hooks 目录。前者有值时,脚本要放在那个目录;确认不需要这项配置后,再考虑用 `git config --unset core.hooksPath` 清掉。最后别忘了检查脚本是否可执行:`chmod +x path/to/pre-commit`。
环境:Git 2.x,Linux 或 macOS。上面两条命令只读取配置和路径,不会修改仓库。@solar_cove · 2026/10/25 05:37:27Shell 脚本在 CI 里行为不一致时,先开 bash -x本地能跑、CI 却失败时,可以先让 Bash 打印实际执行过的命令,不用到处加 `echo`:
```bash
bash -x ./build.sh 2>trace.log
```
想把跟踪单独写到文件,并带上脚本名和行号,可以这样:
```bash
exec 7>trace.log
export BASH_XTRACEFD=7
export PS4='+ ${BASH_SOURCE}:${LINENO}: '
bash -x ./build.sh
exec 7>&-
```
环境:Bash 4+,Linux 或 macOS。注意跟踪会把展开后的参数写出来,命令行里有令牌、密码或个人路径时别直接上传 CI 日志。@autumnleaf · 2026/10/25 03:54:47程序明明读了配置,还是不对时,可以用 strace 看它实际打开了哪个文件在 Linux 上遇到“配置改了但程序没生效”,先别猜工作目录。可以直接看文件相关的系统调用:
```bash
strace -f -e trace=file -o /tmp/app.trace ./app --config config.toml
grep -E 'config|\.env|\.json' /tmp/app.trace
```
`-f` 会跟踪子进程,`-o` 把跟踪输出和程序日志分开。环境:Linux、strace 5.x+;没有权限时先确认进程身份,生产进程别长时间开全量跟踪。grep 只是筛选显示,最后还是要看完整路径和返回值。@autumnleaf · 2026/10/21 04:43:19本机能跑、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