#Shell
共 18 篇文章
rsync 升级后远程路径多了引号,报 change_dir 失败
rsync3.2.4开始保护远端参数,变量内额外引号可能成为真实路径字符。修正路径值与本地引用,审慎评估old-args和受限shell。
rsync --append-verify 跳过了大小不变的已修改文件
append-verify仍跳过等长目标,不适用于改写中的磁盘镜像。稳定源后移除追加模式,按普通选择和私有partial-dir恢复,并验收内容与可恢复性。
GNU sed 同时使用 -n 和 -i 后文件变空
GNU sed 的 -n 关闭自动打印,-i 将输出写回原文件;删行脚本没有打印剩余行时会得到空文件。先预览完整输出、保留独立备份,再修正选项。
rsync 3.5.0:/dev/stdin 报 ENOENT
3.5.0可能无法打开管道上的/dev/stdin和stdout,3.5.1已修复。清单改用files-from=-,日志要单独核验,退出0不代表采集成功。
diff 内容相同,rsync 仍重复列出待更新文件
diff 内容相同而 rsync 仍列出待更新文件时,用 -i 分辨传输和属性更新,再用校验和预演核对修改时间差异,保留必要的备份属性。
GNU timeout 分两次执行,无法先发 INT 再强制结束同一进程
GNU timeout 的 --kill-after 从首个信号发出时开始计时。将 INT 和 KILL 安排在一次调用中,区分主时长、追加宽限时间、返回状态和 foreground 的子进程限制。
GNU sed -i 使用输入重定向时报 no input files
输入重定向只连接标准输入,不会传入原地编辑所需的文件路径。区分查看转换输出和保存回文件,修正参数并保留可恢复备份。
sudo source 报 command not found,环境变量没有传给后续命令
source 是 Bash 内建命令,sudo 不会自动调用 Shell 解释它。按变量用于当前终端还是提权程序,选择直接加载或在同一次 Bash 调用中加载并启动程序。
Bash =~ 正则加引号后始终不匹配
Bash 将被引用的正则部分按字面匹配。通过区分变量赋值与匹配处的引用,修正条件表达式,并正确处理返回状态和 BASH_REMATCH 捕获结果。
grep -c 同一行多次匹配只计一次,统计结果偏小
GNU grep 的 -c 统计匹配行数。用 -o 分离非空匹配后计数,并区分无匹配、读取失败,以及完整单词、重叠和空匹配的不同要求。
Linux 脚本已有执行权限,运行仍报 Permission denied
Linux 脚本已有执行位仍报 Permission denied 时,检查实际路径的 noexec 挂载限制,区分解释器读取与直接执行,并选择迁移目录或调整挂载策略的处理方式。
while read 中的 SSH 只执行第一台主机
主机清单可以完整打印,加入 SSH 后却只执行第一台。检查循环与 SSH 共享标准输入的情况,按远端是否需要输入选择 -n 或独立文件描述符。
Linux 删除大日志后磁盘空间未释放,lsof 仍显示 deleted
删除日志后 df 占用不降,可能仍有进程持有旧文件。用 lsof 核对链接数、设备和持有者,再通过日志重开或受控重启释放引用,避免强杀和盲目截断。
数字列表已排序,comm 仍报 not in sorted order 或漏掉共同记录
comm 要求输入遵循同一字符排序规则,数值升序可能让共同 ID 被误分。使用一致的 locale 生成排序副本,显式检查顺序,并区分空交集、执行失败和重复记录。
sudo 重定向写文件报 Permission denied
sudo 命令后用 > 写入受保护文件仍报 Permission denied,是因为当前 shell 先打开重定向目标。区分 shell、sudo 和 tee 的错误,并按覆盖、追加或编辑配置选择写入方式。
Bash 已开启 expand_aliases,同一行调用别名仍报 command not found
Bash 在读取命令时展开别名,同一行执行的 alias 定义来不及影响后续调用。通过独立输入行或函数修复,并区分复合命令与新 shell 的边界。
cut 按空格取第二列时,连续空格让结果变成空行
cut 以单个空格分隔时,相邻空格之间的空字段也占列号。对空格和 Tab 对齐的文本使用 awk 默认分割,并检查缺失列和原样输出行的差异。


