!["[ -f file ] && command" 대신 "[ ! -f file ] || command"를 사용해야 하는 이유가 있나요?](https://rvso.com/image/88490/%22%5B%20-f%20file%20%5D%20%26%26%20command%22%20%EB%8C%80%EC%8B%A0%20%22%5B%20!%20-f%20file%20%5D%20%7C%7C%20command%22%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%B4%EC%95%BC%20%ED%95%98%EB%8A%94%20%EC%9D%B4%EC%9C%A0%EA%B0%80%20%EC%9E%88%EB%82%98%EC%9A%94%3F.png)
나는 찾았다
[ ! -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
존재하지 않을 때 참이다또는다른 파일 형식입니다.
따라서 가독성을 제외하면 실제 차이는 없습니다.