我如何重定向失败的 if 条件的错误

我如何重定向失败的 if 条件的错误

我试图更好地理解 STDERR 以及在循环的初始测试阶段何时/何处放置 2> 。

我的脚本如下...

#!/bin/bash

file1=/tmp/file1
file2=/tmp/file2

if [ -e $file1 -o -e $file2 ]; then
  if ls $file1 2>> err.log ; then
     echo "file1 exists" | tee -a job.log
  fi

  if ls $file2 2>> err.log ; then
    echo "file2 exists" | tee -a job.log
  fi
else
 echo "neither $file1 or $file2 exists"
fi

但是,当 file1 或 file2 不存在时,我希望将以下内容附加到 err.log

ls: 无法访问 /tmp/file1: 没有这样的文件或目录

但没有任何内容被写入 err.log 中......不确定我错过了什么,但我认为逻辑很简单。

任何见解都将受到高度赞赏。

答案1

正如 cas 指出的那样,您不必要地使用ls.您的脚本可以写成如下:

#!/bin/bash

file1='/tmp/file1'
file2='/tmp/file2'

if [[ -e "$file1" ]]; then
    echo "file1 exists" | tee -a job.log
else
    echo 'ls: cannot access /tmp/file1: No such file or directory' >>err.log
fi
if [[ -e "$file2" ]]; then
    echo "file2 exists" | tee -a job.log
else
    echo 'ls: cannot access /tmp/file2: No such file or directory' >>err.log
fi
[[ ! -e "$file1" && ! -e "$file2" ]] && echo "neither $file1 or $file2 exists"

ls 错误可能应该更改,但这是您希望在错误文件中看到的内容,所以我留下了它们:)

答案2

如果至少有一个文件存在,则应将错误写入该文件。如果两者都不存在,则if语句将直接跳转到根本else不运行的子句。ls

如果您想附加错误消息,如果两个都文件不存在,您可以在else子句中手动执行此操作,如下所示:

#!/bin/bash

file1=/tmp/file1
file2=/tmp/file2

if [ -e $file1 -o -e $file2 ]; then
  if ls $file1 2>> err.log ; then
     echo "file1 exists" | tee -a job.log
  fi

  if ls $file2 2>> err.log ; then
    echo "file2 exists" | tee -a job.log
  fi
else
 echo "neither $file1 or $file2 exists"
 ls $file1 2>> err.log
 ls $file2 2>> err.log
fi

ls即使您知道文件不存在,也会运行该命令,因此您的文件中记录了命令错误。

请注意,从实际角度来看,该代码没有多大意义,但如果它是为了学习的唯一目的而编写的,那么这应该不重要。

相关内容