程序员茄子
全部
编程
代码
资讯
案例
综合
联系我们
Shell 相关技术文章
php
mysql
shell
go
vue
css
api接口对接
支付接口对接
jq 1.8.2 一次修了 16 个 CVE:把不可信 JSON 喂给 jq 的代价
编程
jq 1.8.2 一次修了 16 个 CVE:把不可信 JSON 喂给 jq 的代价
2026-10-26 21:05:10
jq 常被塞进流水线解析外部 API、日志和用户上传的 JSON。1.8.2 一次修了 16 个 CVE:路径与 contains 的递归深度、堆溢出与越界读、NUL 截断导致的校验失真、哈希碰撞 DoS。按触发方式分组说明,并给出输入限长、ulimit、深度检查与制品校验的具体写法。
Shell
安全
jq
运维
凌晨 3 点的备份脚本:用 set -x、PS4 行号、trap ERR 和 shellcheck 逐层排查
综合
凌晨 3 点的备份脚本:用 set -x、PS4 行号、trap ERR 和 shellcheck 逐层排查
2026-10-24 20:01:33
一个每天凌晨跑的备份脚本,失败了却永远打印「备份完成」。本文从这段坏脚本出发,讲三层 Bash 排错手段:set -x 配自定义 PS4 打出文件名和行号、set -Eeuo pipefail 加 trap ERR 捕获 LINENO 与 BASH_COMMAND、bash -n 与 shellcheck 静态检查,末尾附可直接抄走的生产脚本骨架和断言写法。
Shell
Bash
运维
脚本调试
cron
脚本打印 done、产物却是 0 字节:tee 吞掉了退出码,137 才露出 OOM 的手
编程
脚本打印 done、产物却是 0 字节:tee 吞掉了退出码,137 才露出 OOM 的手
2026-10-23 21:31:53
夜间任务每天照常打印 done,汇总文件却是 0 字节。根因是 `curl | tee` 只返回 tee 的退出码。打开 pipefail 后看到 137(SIGKILL),再用 cgroup memory.events 确认 OOM;配套 preflight 预检、逐条 checkpoint + fsync、结尾数量对账,以及一张贴在任务旁的退出码表。
Shell
Bash
Linux运维
cgroup
排障
BOM 的消费端:shell 报 Exec format error、Go 报 illegal byte order mark、JSON 解析停在第 0 位
案例
BOM 的消费端:shell 报 Exec format error、Go 报 illegal byte order mark、JSON 解析停在第 0 位
2026-10-22 00:03:42
同一个 EF BB BF,在导出侧是 Excel 认 UTF-8 CSV 的必需品,在消费侧却让内核 execve 返回 ENOEXEC、Go 编译器报 illegal byte order mark、JSON.parse 在第 0 位失败。整理字节层确认方法、shell/Go/Python/Node/Jackson/PHP 的行为对照表,以及 sed 去 BOM、CI 检查与 .gitattributes 不管 BOM 的边界。
BOM
UTF-8
字节序标记
Shell
Go
JSON
字符编码
Bash 5.3 的 ${ cmd; }:在 PS0 里改当前 shell 变量,做 preexec 与命令计时
编程
Bash 5.3 的 ${ cmd; }:在 PS0 里改当前 shell 变量,做 preexec 与命令计时
2026-10-21 21:06:11
Bash 5.3 新增的 ${ cmd; } 让 PS0 能直接改当前 shell 的变量,于是命令计时与 preexec 不必再挂 DEBUG trap。本文给出用 BASH_MONOSECONDS 计时的配置、展开与执行顺序,以及为什么 DEBUG trap 不适合做耗时统计。
Shell
Bash
终端配置
logrotate:copytruncate 与 create 怎么选,以及「轮转了但磁盘不释放」的排查顺序
综合
logrotate:copytruncate 与 create 怎么选,以及「轮转了但磁盘不释放」的排查顺序
2026-10-19 21:05:23
logrotate 的 create 与 copytruncate 本质是进程 fd 指向哪个 inode。讲清 Nginx/PHP-FPM 必须 reopen、copytruncate 的丢日志窗口与 IO 峰值、df 与 du 不一致时用 lsof +L1 定位、以及容器里为什么不该跑 logrotate。
Shell
运维
日志
Linux
用发行版自带工具做服务器自动化:systemd timer、加固 SSH、机群循环与自动打补丁
综合
用发行版自带工具做服务器自动化:systemd timer、加固 SSH、机群循环与自动打补丁
2026-10-16 21:32:19
不用引入新工具,用主流发行版自带的 systemd timer/cron、OpenSSH 加固(受限密钥 command=/from=、Match+ProxyJump)、ssh+bash 机群循环、logrotate 与 unattended-upgrades/dnf-automatic 搭一套可复现的服务器自动化,并说清脚本能执行但不能观察/决策/解释的边界。
运维
Shell
Linux
SSH
systemd
sup:用一份 Supfile 把命令并行发到多台主机,无需 agent 的部署工具
编程
sup:用一份 Supfile 把命令并行发到多台主机,无需 agent 的部署工具
2026-10-16 21:31:15
pressly/sup(Stack Up)是一个用一份 YAML(Supfile)把命令并行发到多台主机的部署工具,复用系统 ssh,不用装 agent。本文讲清 networks/commands/targets 结构、serial 滚动更新、once 只在单机执行、upload/交互式 stdin、target 组合与失败即中断,以及 ssh-agent 连不上的排错。
Shell
部署
运维
SSH
Go
ShellCheck 到底比 bash -n 多查了什么:三条高频规则与 CI 落地
编程
ShellCheck 到底比 bash -n 多查了什么:三条高频规则与 CI 落地
2026-10-16 21:05:59
ShellCheck 比 bash -n 多做变量数据流与控制流分析。讲清 SC2086(引号)、SC2164(cd 退出码)、SC2155(local 吞退出码)三条高频规则的成因与改法,以及 CI/pre-commit 集成、disable 滥用、忽略被 source 文件等落地坑。
Shell
ShellCheck
bash
运维
mise 日常命令改走 mise-versions:没配 GitHub token 也不用撞 60 次/小时限流
编程
mise 日常命令改走 mise-versions:没配 GitHub token 也不用撞 60 次/小时限流
2026-10-15 21:03:21
mise v2026.10.11 让 install/exec/outdated/lock/self-update 等命令不再调用 api.github.com,改从 mise-versions 读取 release、tag 与 attestation,没配 token 的用户不再撞 60 次/小时限流。文中讲清仍直连 GitHub 的场景,并提到 path: 工具的 PATH 信任绕过修复。
mise
开发工具
GitHub
Shell
locale 起效顺序与六个坑:从 locale-gen 到 LC_ALL=C
编程
locale 起效顺序与六个坑:从 locale-gen 到 LC_ALL=C
2026-10-15 01:37:05
locale 是 glibc 的语言文化规则集,但 LANG、LC_*、LC_ALL、LANGUAGE 谁覆盖谁经常踩坑。这篇按 man 7 locale 的解析顺序讲清优先级,给出 locale-gen、localectl 等启用步骤,并列出排序随环境变化、小数点逗号、容器缺 locale 报错等六个实战坑。
locale
Linux
i18n
环境变量
Shell
运维
git checkout 拆成两条命令:Git 2.23 的 git switch / git restore 选项行为与迁移对照
编程
git checkout 拆成两条命令:Git 2.23 的 git switch / git restore 选项行为与迁移对照
2026-10-14 23:42:57
Git 2.23 把 git checkout 的「切分支」和「检出文件」拆成 git switch 与 git restore 两条新命令。本文按官方文档逐项拆解两者的命令签名与选项行为(-c/-C、--detach、--guess、--source、--staged/--worktree、--overlay 等),给出从 checkout/reset 迁移的对照表,并说明为什么 checkout 没有被废弃。
新命令
Git
Shell
版本控制
命令行
initdb 初始化集群:排序规则与 trust 认证建完就改不动
编程
initdb 初始化集群:排序规则与 trust 认证建完就改不动
2026-10-14 23:42:30
initdb 创建 PostgreSQL 集群时,排序规则、locale provider、编码和 WAL 段大小在初始化时就定死,默认信任认证还允许任意本地用户成为超级用户。梳理目录权限 0700/0600、-A scram-sha-256/-W/--pwfile 的用法,以及换 locale 只能清空重建的原因。
initdb
PostgreSQL
数据库
locale
排序规则
认证
运维
Shell
Bash 5.3 的命令替换 ${ command; }:省掉 fork,副作用留在当前 shell
编程
Bash 5.3 的命令替换 ${ command; }:省掉 fork,副作用留在当前 shell
2026-10-02 21:03:49
Bash 5.3 新增 ${ command; } 与 ${| command; } 两种在当前 shell 上下文执行的命令替换,省掉 fork 与管道,代价是副作用(变量、cd、状态)会留在当前 shell。另含 GLOBSORT、compgen -V、read -E、source -p PATH、BASH_MONOSECONDS、fltexpr,以及 C23 带来的编译要求变化。
Bash
Shell
Linux
脚本
运维
管道
set -o pipefail 搭配 grep -q:匹配到了,if 却返回 false
编程
set -o pipefail 搭配 grep -q:匹配到了,if 却返回 false
2026-10-01 21:02:26
开了 set -o pipefail 后把流管道给 grep -q,会因 grep 提前退出让上游收到 SIGPIPE,导致命中也被判失败。给出进程替换、awk、先物化等修法,以及 trap EXIT 与 ERR trap 的相关注意点。
Shell
Bash
pipefail
grep
运维脚本
pip
竞态
脚本终端能跑放进 crontab 就没了反应:环境变量、flock 与排查顺序
代码
脚本终端能跑放进 crontab 就没了反应:环境变量、flock 与排查顺序
2026-09-27 20:02:14
脚本在终端里跑得正常,放进 crontab 却毫无反应,问题基本都出在「环境不一致」。本文按时间语法、环境变量、重定向、flock 防重叠、时区、Docker 容器五个坑逐条拆解,附排查顺序:systemctl status cron、grep CRON /var/log/syslog、journalctl -u cron、crontab -l,以及用 env 输出对比 cron 实际环境的方法。
crontab
Shell
flock
定时任务
运维
install.sh 报 env: 'bash\r' 不是权限问题:CRLF、dash/noexec 与 cron PATH 的排查笔记
代码
install.sh 报 env: 'bash\r' 不是权限问题:CRLF、dash/noexec 与 cron PATH 的排查笔记
2026-09-23 21:02:58
脚本在终端能跑、部署就报 env: 'bash\r' 或 syntax error,先别急着 chmod +x。这篇按 CRLF 换行污染、/bin/sh 指向 dash、noexec 挂载、cron 精简 PATH 四类环境差异给出排查顺序,含 file/od 验证、sed 清洗、env -i 最小环境复现与 while read 读文件的安全写法。
Shell
Linux
运维
脚本
Bash 脚本上生产前的六个坑:set -e 不生效、管道里变量丢了、文件名带空格
编程
Bash 脚本上生产前的六个坑:set -e 不生效、管道里变量丢了、文件名带空格
2026-09-20 21:04:01
把 Bash 脚本上生产前最容易踩的六个坑讲清:for f in $(ls) 被文件名空格拆开、变量不加引号、set -euo pipefail 管不到的分支、管道右侧子 shell 丢变量、缺 trap 清理、缺调试手段。给出可复制的 NUL 分隔遍历与完整脚本骨架。
Shell
Bash
运维
Linux
脚本
GNU Coreutils 9.12 运维笔记:env --env0-from 与默认 shell 引号
编程
GNU Coreutils 9.12 运维笔记:env --env0-from 与默认 shell 引号
2026-09-16 21:04:31
GNU Coreutils 9.12 发布说明笔记:env 新增 --env0-from=FILE 读 NUL 分隔环境项、stat/tail 认识 failfs/nullfs、uname -A 逐行标注;三个行为变更更值得注意——env/printenv 默认按 shell 引号输出、ls -w 不再把换行算进行宽、stat 默认对文件名加引号并新增 %Qn。文末给出会踩到的脚本场景与自查清单。
Shell
Linux
命令行
运维
AD
终端能跑、进 cron 就废:Shell 脚本丢变量、丢 PATH、删错路径的修法
编程
终端能跑、进 cron 就废:Shell 脚本丢变量、丢 PATH、删错路径的修法
2026-09-16 20:03:29
Shell 脚本在终端跑得好、进 crontab 就找不到命令,管道里的计数变量莫名丢失,文件名带空格就删错路径——这些不是语法问题。本文从真实故障切入,给出 set -euo pipefail、trap 清理、find -print0|while IFS= read -r、cron 的 PATH/HOME 显式声明、7 种括号的正确用法等可复制的写法。
Shell
Bash
运维
脚本
crontab
健壮性
Bash 5.3 发布:命令替换不再 fork 子进程,MULTIPLE_COPROCS 默认启用
综合
Bash 5.3 发布:命令替换不再 fork 子进程,MULTIPLE_COPROCS 默认启用
2026-09-15 21:02:47
Bash 5.3 距 5.2 三年,最实用的改动是两种不再 fork 子进程的命令替换(${ cmd; } 与 ${| cmd; }),另有 GLOBSORT、compgen -V、read -E、trap -P 等。本文按核心特性、Readline 8.3 变更与落地建议整理,含源码编译前置依赖。
Shell
Bash
Linux
版本发布
TIP
`set -euo pipefail` 写了,函数里失败却继续跑:errexit 的例外与 ERR trap 的继承
编程
`set -euo pipefail` 写了,函数里失败却继续跑:errexit 的例外与 ERR trap 的继承
2026-09-15 00:03:29
脚本开头写了 set -euo pipefail,函数里命令失败却继续执行、trap ERR 不触发。从 man bash 的 errexit 例外清单讲起:why 函数体在 if/|| 上下文里 -e 失效、ERR trap 需要 set -E 才继承、$(...) 里 -e 默认关闭要用 inherit_errexit,附打包函数取退出码、trap 配方与 ShellCheck/Bats 检查链路。
脚本编程
Shell
Bash
错误处理
ShellCheck
pip
用 Codex 写 Linux 巡检脚本:默认只读是边界,--self-test 才是验收
综合
用 Codex 写 Linux 巡检脚本:默认只读是边界,--self-test 才是验收
2026-09-12 21:02:58
用 Codex 写 Linux 主机巡检脚本的工程要点:默认只读的安全边界、采集/判断/报告三层架构、退出码 0/1/2/3 约定、把「无法检查」与「检查正常」严格分开,以及用 --demo 和 --self-test 做可验收的交付。附采集命令清单与验收步骤。
Shell
运维
Linux
巡检
部署脚本退出码 127/126/137/139:Linux 自动化安装失败的排查路径
综合
部署脚本退出码 127/126/137/139:Linux 自动化安装失败的排查路径
2026-09-12 21:02:58
Linux 自动化安装脚本失败时,退出码是最直接的诊断入口:127 二进制不在 PATH、126 权限或 noexec、137 被 OOM Killer 杀、139 ABI 段错误。附 strace、dmesg -T、curl -Iv、mtr 的排查用法,以及一段可直接放进脚本头部的防御性调试片段。
Shell
运维
故障排查
大家都在搜索什么?
devops
易支付
一个官网+多少钱
统一接受回调
统一回调
python
sub
node
宝塔日志
mysql
shell
ElasticSearch
css
vue
api接口对接
2025
支付接口对接
go
php
php回调
上一页
1
2
下一页
共 2 页
到第
页
确定