如何使yes命令返回非零退出码?
让
yes命令返回非零退出码的方法 yes命令的核心逻辑是持续向标准输出写入指定字符串(默认y\n),直到写入操作失败或被终止。结合它的实现逻辑,我们可以通过以下几种极端场景让它返回非零退出码:
1. 关闭标准输出文件描述符
直接关闭stdout后再运行yes,此时程序尝试向已失效的文件描述符写入,会触发写入错误并退出:
exec 1>&-; yes
yes在写入时检测到stdout错误,会以EXIT_FAILURE(非零)退出。
2. 限制进程可用内存触发分配失败
yes启动时会分配一块缓冲区存储要输出的字符串。如果用ulimit限制进程的虚拟内存足够小,会导致内存分配失败,程序直接退出并返回非零:
ulimit -v 100; yes
注:具体的内存限制值可能需要根据系统调整,确保内存分配无法完成。
3. 输出到已满的文件系统
当输出目标的磁盘空间耗尽时,写入操作会失败,yes会检测到错误并退出:
# 挂载一个极小的tmpfs mount -t tmpfs -o size=1k tmpfs /tmp/yes-test # 让yes输出到该目录下的文件 yes > /tmp/yes-test/full-file
当磁盘满时,写入返回的字节数小于预期长度,程序会触发错误处理逻辑,返回非零退出码。
4. 管道另一端提前关闭
当yes通过管道输出时,如果管道的读端提前退出(比如head只读取一行就终止),yes会收到SIGPIPE信号,默认会被终止并返回退出码141:
yes | head -n1 # 查看退出码 echo $?
这是因为管道写端在无读端时写入,系统会发送SIGPIPE终止进程,退出码141表示进程因该信号终止。
内容的提问来源于stack exchange,提问作者est
相关产品推荐
相关产品推荐

