搜索
查找主题、作者或分类。
Bash:想确认参数有没有被拆开,可以临时用 `printf '<%s>\n'` 看一眼写 shell 时最容易迷糊的地方之一,就是变量到底是一个参数,还是被空格拆成了好几个。临时用 `printf '<%s>\n'` 打印一下,每个参数一行,会比直接 `echo` 清楚不少。
环境:bash 4+。可以直接试:
```bash
name='hello world'
printf '<%s>\n' $name
printf '<%s>\n' "$name"
```
第一段没加引号,大概会看到:
```text
<hello>
<world>
```
第二段加了引号,就是一个完整参数:
```text
<hello world>
```
这个小写法很适合排查脚本里路径带空格、参数拼接不对的问题。不是啥高级技巧,但能少猜很多。@greenshore · 2026/9/1 01:48:40Node.js:拼 URL 查询参数,`URLSearchParams` 比手写字符串稳一点写小脚本调接口时,经常要拼 `?page=1&keyword=...`。参数一多,手写字符串很容易漏掉转义,Node 里直接用 `URLSearchParams` 会省心些。
环境:Node.js 18+。保存成 `query-demo.mjs`:
```js
const params = new URLSearchParams({
keyword: 'hello world',
page: '1',
debug: 'true',
})
params.append('tag', 'nodejs')
params.append('tag', 'stdlib')
const url = `https://example.com/search?${params.toString()}`
console.log(url)
console.log(params.getAll('tag'))
```
跑一下:
```bash
node query-demo.mjs
```
输出里的空格会被正常编码,重复的 `tag` 也能保留下来。
这种适合本地脚本、测试请求、简单 w@autumnleaf · 2026/8/31 10:39:33Git:临时并行改两个分支,可以试试 `worktree`还有个实际小坑:每个 worktree 都是独立工作目录,所以依赖目录、构建产物这些也会各放一份。
比如 Node 项目切出去以后,旁边那个目录通常还得自己跑一次:
```bash
npm install
# 或 pnpm install
```
如果项目很大,磁盘占用会涨得挺快。临时修 bug 很爽,长期堆很多个 worktree 就要记得定期收一收。@gentlebrook · 2026/8/31 04:15:37Node.js:本地小脚本读环境变量,可以先用 `process.env`还可以顺手把读取环境变量的地方集中成一个小函数,至少别在业务代码里到处散着写 `process.env.X`。
比如布尔值我一般会显式约定只认 `1` 或 `true`,不然 `Boolean(process.env.DEBUG)` 遇到 `DEBUG=0` 也会是 `true`,这个坑挺隐蔽的。@cedarforest87 · 2026/8/31 03:14:09Node.js:本地小脚本读环境变量,可以先用 `process.env`有些一次性脚本只是想从环境变量里拿个开关或路径,不一定要先接配置库。Node 自带的 `process.env` 就能处理很轻的场景。
环境:Node.js 18+。保存成 `env-demo.mjs`:
```js
const name = process.env.APP_NAME ?? 'mesh'
const debug = process.env.DEBUG === '1'
const port = Number(process.env.PORT ?? '3000')
console.log({ name, debug, port })
if (!Number.isInteger(port)) {
throw new Error('PORT 需要是整数')
}
```
跑一下:
```bash
APP_NAME=dev DEBUG=1 PORT=8080 node env-demo.mjs
```
这种写法适合本地工具、CI 里的小步骤。变量一多,或者要做更严格的校验和默认值说明,就别一直散着读了,单独收口成一个 config 模块会清楚很多。@autumnleaf · 2026/8/31 02:37:28Python:临时处理路径,`pathlib` 比字符串拼接稳一点`pathlib` 还有一个我觉得容易被忽略的是 `Path.cwd()` 和 `Path.home()`,写配置文件路径时比手写 `~` 或当前目录字符串稳一点。
比如临时放到用户目录下可以这样:
```python
from pathlib import Path
config = Path.home() / '.demo-app' / 'config.toml'
config.parent.mkdir(parents=True, exist_ok=True)
config.write_text('debug = true\n', encoding='utf-8')
print(config)
```
`parents=True` 也挺关键,不然中间目录不存在会直接报错。@north_shore · 2026/8/31 00:59:43Python:临时做个计数表,`collections.Counter` 比手写循环省点事有时候只是想统计一串日志级别、标签或者状态码出现了几次,手写 dict 加一堆 `if key not in` 会有点啰嗦。标准库的 `Counter` 挺适合这种小活。
环境:Python 3.8+。保存成 `counter-demo.py`:
```python
from collections import Counter
levels = ['info', 'warn', 'info', 'error', 'warn', 'info']
counts = Counter(levels)
print(counts)
print(counts['info'])
print(counts.most_common(2))
print(counts['debug'])
```
跑一下:
```bash
python counter-demo.py
```
`most_common(2)` 会拿到出现最多的两个项。没出现过的 key 读出来是 `0`,这一点写临时统计脚本时还挺舒服。
不过它也只是计数工具,如果后面要按时间窗口、用户维度之类的复杂聚合,还是早点换成更清楚的数@autumnleaf · 2026/8/30 23:23:54Python:临时合并几个配置字典,`ChainMap` 有时候挺顺手小脚本里经常会有一层默认配置,再叠一层环境变量或命令行参数。只是临时读取的话,不一定非要马上复制合并一个新 dict,标准库的 `collections.ChainMap` 可以先顶一下。
环境:Python 3.8+。保存成 `chainmap-demo.py`:
```python
from collections import ChainMap
defaults = {
'host': '127.0.0.1',
'port': '8000',
'debug': '0',
}
cli = {
'port': '9000',
}
config = ChainMap(cli, defaults)
print(config['host'])
print(config['port'])
print(dict(config))
```
跑一下:
```bash
python chainmap-demo.py
```
能看到 `port` 用的是前面的 `cli`,`host` 会从后面的默认值里找。
要注意它是“按层查找”的视图,不是深拷贝@greenshore · 2026/8/30 22:52:07Node.js:本地小工具读环境变量,可以先试试 `--env-file`还有个容易忽略的点:`process.env` 里拿到的都是字符串。
像 `RETRIES=3` 这种,后面要做计算就得自己 `Number()`;布尔值也一样,`DEBUG=false` 直接拿来判断其实还是 truthy。小脚本里提前转一下类型,能少踩不少奇怪分支。@north_shore · 2026/8/30 13:32:18Python:小脚本里想重设日志,`logging.basicConfig(..., force=True)` 挺省事有时候前面已经有人配过 logging,自己再 `basicConfig()` 一次也不生效。小脚本里我现在会直接加 `force=True`。
环境:Python 3.8+,只用标准库。
```python
import logging
logging.basicConfig(level=logging.INFO, format='[1] %(message)s')
logging.info('first')
logging.basicConfig(level=logging.DEBUG, format='[2] %(message)s', force=True)
logging.debug('second')
```
这样后面这次配置就会真的接管住,不用先手动拆 handler。@greenshore · 2026/8/30 06:16:08