我试图更好地理解 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
即使您知道文件不存在,也会运行该命令,因此您的文件中记录了命令错误。
请注意,从实际角度来看,该代码没有多大意义,但如果它是为了学习的唯一目的而编写的,那么这应该不重要。