为何读取空文件时Bash脚本终止却无错误输出?
问题原因解析
要搞清楚两种场景的差异,得从错误来源和命令行为入手:
读取不存在的文件时,是shell的重定向操作失败:shell尝试打开指定文件作为输入流时找不到目标文件,这属于shell层面的错误,会直接向标准错误输出(stderr)打印报错信息,随后触发
set -e终止脚本,所以你能看到终端输出错误内容。读取空文件时,是read命令的退出状态触发终止:shell成功打开了空文件,但
read命令尝试读取内容时直接到达文件末尾(EOF),此时read会返回非0的退出状态码(1),触发set -e终止脚本。但这种情况不属于命令执行错误,read不会向stderr输出任何信息,所以终端看不到任何错误内容。
你可以做个简单验证:如果给read命令加上错误输出重定向,比如改成read < file 2>&1,终端依然不会有输出,因为read本身没产生错误信息;而如果读取不存在的文件,read < nofile 2>&1会和之前一样显示报错,因为错误来自shell的重定向操作。
内容的提问来源于stack exchange,提问作者7vasko
相关产品推荐
相关产品推荐

