"[ -f file ] && command" 대신 "[ ! -f file ] || command"를 사용해야 하는 이유가 있나요?

"[ -f file ] && command" 대신 "[ ! -f file ] || command"를 사용해야 하는 이유가 있나요?

나는 찾았다

[ ! -f /etc/default/lxc-net ] || . /etc/default/lxc-net

대체 /etc/default/lxc되는 것으로 보이는 Ubuntu 16.04(내 자체 또는 패키지 유지 관리 코드)

[ -f /etc/default/lxc-net ] && . /etc/default/lxc-net

테스트가 반직관적이기 때문에(파일이 없다는 테스트에 실패한 경우 명령을 실행함) -version에 비해 어떤 이점이 있는지 궁금합니다 &&.

답변1

네, 신경 쓰신다면복합 문의 종료 코드. 다음을 시도해 보세요:

#! /bin/sh -

! "$@" || true
echo "$?"

"$@" && true
echo "$?"

true그런 다음 및 false인수로 실행하십시오 .

./script true
0
0

./script false
0
1

이 때문입니다단락 평가부울 표현식의

OP의 예에서 가정 해 봅시다파일이 존재하지 않습니다:

  • 첫 번째 경우 첫 번째 조건은 TRUE를 반환하므로 두 번째 연산( TRUE OR x = TRUE)을 평가할 필요가 없습니다. 복합문에 대해서는 TRUE를 얻습니다.
  • 두 번째 경우에는 첫 번째 조건이 FALSE를 반환하므로 두 번째 작업( FALSE AND x = FALSE)을 평가할 필요가 없습니다. 복합문에 대해서는 FALSE를 얻습니다.

종료 코드는 매우 중요합니다. 확인하다bash 스크립트에서 set -e는 무엇을 의미합니까?set -e, trap및 의 가능한 의미를 확인합니다 set -o pipefail.

답변2

[ -f file ]file존재할 때 참이다그리고입니다 plain file.

[ ! -f file ]file존재하지 않을 때 참이다또는다른 파일 형식입니다.

따라서 가독성을 제외하면 실제 차이는 없습니다.

관련 정보