首页 > 解决方案 > 不存在文件的脚本没有错误

问题描述

我有一个读取文本文件并使用其内容的 shell 脚本。到目前为止,一切都很好。但是现在如果找不到文件,我正在尝试让脚本退出。脚本看起来像这样

#!/bin/bash

function errorcatcher() {
  errorcode=$?
  echo "ERROR CODE : ${errorcode}"
  exit ${errorcode}
}

trap errorcatcher ERR

MYFILE=$1

IFS='|'

while read line; do
  echo ${line}
done < ${MYFILE}

echo "Execution complete"

我将脚本运行为

sh myscript.sh /home/mydir/ABC.txt

它工作正常。但如果我试试这个

sh myscript.sh /home/mydir/nonexisting.file

我明白了

myscript.sh: line 17: /home/mydir/nonexisting.file: No such file or directory
Execution complete

函数errorcatcher没有被调用,并且没有以错误代码退出,而是继续执行,Execution complete即使有问题的文件不存在,我也会得到该行。我的猜测是这里没有产生错误,所以我在阅读文本文件之前添加了这一行

ls ${MYFILE}

这次errorcatcher被调用。但如果我尝试

sh myscript.sh /home/mydir/ABC.tx

我没有传递现有文件ABC.txt,而是传递其不完整的名称ABC.tx,并且再次errorcatcher不调用该函数并且脚本成功完成(Execution complete得到回显)。

有人可以帮我解决这个问题吗?我很好奇为什么errorcatcher不被调用

  1. 对于不存在的文件ls
  2. 对于不完整的文件名(ABC.tx)ls

标签: linuxshellunixsh

解决方案


函数errorcatcher没有被调用……</p>

确实,在重定向循环时出现错误,例如

while read line; do
  …
done < ${MYFILE}

ERR调用陷阱。您在命令的实现中发现了一个未记录的异常trap,或者,如果您愿意,还发现了一个错误。

您可以通过在 之前添加额外的重定向测试来避免这种情况while,例如该行

<$MYFILE

它自己将调用错误陷阱。


推荐阅读