GNU xargs 空输入:什么也没读到,为什么命令仍运行了一次 批处理脚本筛出零个任务后,下游命令却仍运行了一次,是一种特别隐蔽的空批次问题。某些程序在没有位置参数时会读取标准输入、采用默认目录,甚至执行与有参数时不同的动作。GNU xargs默认允许一次没有新增参数的调用,因此... yunqueblog/ 技术教程/ 2026-10-03/ 4 阅读
Bash read 的大小写 N:都写三,为什么一个停在换行前,一个把换行读了进去 读取终端或管道的小块文本时,read -n 3与read -N 3只差一个字母大小写,却不是同一种限制。小写n允许在达到字符上限之前遇到分隔符就结束;大写N则把普通分隔符当作读取内容,尝试收满指定字符数,输入结束或超... yunqueblog/ 技术教程/ 2026-10-02/ 2 阅读
Bash GLOBIGNORE 的隐藏副作用:只想排除临时文件,为什么隐藏文件反而出现了 一个打包脚本原本用星号收集当前目录内容,后来为了排除临时文件,设置了GLOBIGNORE为*.tmp。临时文件确实消失了,但原先不在清单里的.hidden却出现了。看似只增加一条排除规则,为什么输入范围反而变大?Ba... yunqueblog/ 技术教程/ 2026-10-02/ 2 阅读
Bash mapfile 的分隔参数:写了两个冒号,为什么仍按每一个冒号切开 输入A::B::C,希望按双冒号分成三项,把-d参数写成两个冒号以后,却读到五项,其中还有空字符串。Bash的mapfile只用delim参数的第一个字符决定记录终点,不会把整段参数解释成多字符分隔串。下面使用带-d... yunqueblog/ 技术教程/ 2026-10-02/ 2 阅读
Bash return 的八位状态:明明返回 256,为什么 if 却进入成功分支 把函数里算出的数量写成return 256,调用后if却认为成功,问号参数也只剩零。Bash的return传递的是命令退出状态,不是任意范围的数值结果。给它一个整数以后,调用者看到的是最低八位,原来的完整数字已经不能... yunqueblog/ 技术教程/ 2026-10-02/ 2 阅读
Bash hash 命令缓存:前面的目录已有新程序,为什么仍然执行旧路径 同名工具明明已经放进PATH前面的目录,当前Bash却仍然启动后面的那份。除了检查别名和函数,还要检查命令路径缓存:Bash可以记住曾经找到的外部命令位置,后续调用不必每次从头搜索所有目录。要稳定复现,不能简单先改一... yunqueblog/ 技术教程/ 2026-10-02/ 2 阅读
Bash 自动分配文件描述符:重定向命令已经结束,为什么通道还可以继续写 普通命令的重定向通常跟着该命令结束,Bash 的 {变量名} 重定向却允许另一种生命周期:让 shell 自动挑选一个可用文件描述符,把编号存进变量,并在命令结束后继续保留它。于是仅执行一次冒号命令,也能为后续多次写... yunqueblog/ 技术教程/ 2026-10-02/ 2 阅读
Bash local -I 的属性继承:同名变量保住了值,整数运算规则为什么还要另外继承 把外层整数变量复制进函数,打印的初值同样是7,不代表两个变量保留了相同属性。Bash变量既有值,也可能带整数、大小写转换等属性。local amount="$amount" 明确复制了值;在本文关闭自动继承选项的条件... yunqueblog/ 技术教程/ 2026-10-02/ 2 阅读
Bash 别名的展开时机:已经换成新定义,旧函数为什么仍然打印旧前缀 脚本先定义别名,再把它写进一个函数,后来改了别名,调用函数却还是旧效果。别名替换发生在命令被读取时;函数定义本身也是一条需要先读取的命令,所以函数体里的相应词可能早已被旧别名展开。下面保存为 demo.sh,用 ba... yunqueblog/ 技术教程/ 2026-10-02/ 2 阅读
Bash extglob 的开启位置:函数第一行已经启用,为什么还没调用就报语法错 把扩展模式放进函数,在函数第一行执行 shopt -s extglob,脚本却还没调用函数就报语法错误。原因是 extglob 也会改变解析器怎样理解括号;解析器必须先读完函数定义,之后才可能执行函数体里的开启命令。... yunqueblog/ 技术教程/ 2026-10-02/ 2 阅读