저는 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
파일이 존재하지 않는다는 것을 알고 있어도 명령이 실행되므로 파일에 명령 오류가 기록됩니다.
이 코드는 실용적인 관점에서 볼 때 별로 의미가 없지만, 학습 목적으로만 작성된 것이라면 문제가 되지 않습니다.