awk与gawk空主体脚本差异:如何让gawk无需等待stdin执行
解决gawk执行仅含BEGIN/END块的脚本时挂起等待stdin的问题
针对你的场景,有两种简洁的解决方法:
方法1:给gawk指定空输入文件
直接在命令行传入/dev/null作为输入源,让gawk读取空文件后直接进入END块:
gawk -f dbchk.awk /dev/null
这是最直观的方式,无需修改脚本,利用系统空设备文件模拟无输入的场景。
方法2:在脚本的BEGIN块末尾添加exit语句
如果不想每次命令行都加参数,可以修改你的dbchk.awk脚本,在BEGIN{}块的最后一行加上exit:
BEGIN { # 你的原有处理逻辑:读取三个文件、排序、一致性检查等 exit # 触发END块执行并终止程序,避免等待stdin } END { # 你的原有END块逻辑 }
awk中exit命令会立即终止主体输入处理流程,直接跳转到END{}块执行,执行完END块后程序退出,不会再等待标准输入。
行为差异说明
macOS默认的BSD awk在无输入文件且无管道输入时,会直接跳过主体处理阶段,执行完BEGIN后就进入END块;而gawk严格遵循POSIX标准,当没有指定输入文件时,默认会从stdin读取输入,这就是两者行为不同的原因。
内容的提问来源于stack exchange,提问作者Rex Block
相关产品推荐
相关产品推荐

