조건이 실패한 경우 오류를 어떻게 리디렉션합니까? [닫기]

조건이 실패한 경우 오류를 어떻게 리디렉션합니까? [닫기]

저는 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파일이 존재하지 않는다는 것을 알고 있어도 명령이 실행되므로 파일에 명령 오류가 기록됩니다.

이 코드는 실용적인 관점에서 볼 때 별로 의미가 없지만, 학습 목적으로만 작성된 것이라면 문제가 되지 않습니다.

관련 정보