Bash 스크립트에서 "&&" 사용을 피해야 하는 이유는 무엇입니까?

Bash 스크립트에서 "&&" 사용을 피해야 하는 이유는 무엇입니까?

저는 두 가지 조건이 있는 간단한 if 섹션이 포함된 bash 스크립트를 작성하고 있습니다.

  if [[ -n $VAR_A ]] && [[ -n $VAR_B ]]; then
    echo >&2 "error: cannot use MODE B in MODE A" && exit 1
  fi

선임 엔지니어가 내 코드를 검토하고 다음과 같이 말했습니다.

후속 라인에서 두 개의 명령을 간단히 실행할 수 있는 경우 &&를 사용하지 마십시오.

그는 더 이상의 설명을 하지 않았습니다. 하지만 호기심에서 이것이 사실인지, 그리고 무엇을 사용하지 말아야 하는지 알고 싶습니다 &&.

답변1

리뷰어의 의견은 아마도 &&연산자의 두 번째 사용을 언급하는 것 같습니다. 당신이 원하지 않는종료하지 마세요제 생각에는 echo실패할 경우 별도의 줄에 명령을 작성하는 것이 더 합리적일 것 같습니다.

if [[ -n $VAR_A ]] && [[ -n $VAR_B ]]; then
    echo >&2 "error: cannot use MODE B in MODE A"
    exit 1
fi

그런데 bash에서는 &&다음 [[ ... ]]조건을 포함할 수 있습니다.

if [[ -n $VAR_A && -n $VAR_B ]]; then

답변2

이것은 일반적으로 불쾌한 의견이 아닙니다 &&. 나는 당신과 이야기하고 있는 엔지니어가 echo실패 자체의 시나리오(매우 가능성은 낮지만 여전히 이론적인 가능성)를 고려하고 있다고 생각합니다. 이것이 있는 경우:

if error; then
    echo foo && exit
fi

echo그런 다음 어떤 이유로 명령이 실패 하면 명령이 exit실행되지 않으므로 실제로 오류를 포착할 수 없습니다. 분리하면 실패 exit하더라도 실행됩니다.echo

if error; then
    echo foo
    exit 
fi

따라서 엔지니어의 말이 실제로 옳았습니다. 이 두 가지 특정 진술을 별도로 유지하는 것이 더 안전합니다. 그러나 이는 사용에 대한 일반적인 지침으로 해석되어서는 안 됩니다 &&. &&한 명령의 실행이 다른 명령의 성공적인 실행에 종속되도록 하려는 경우에만 이 명령을 사용해야 합니다 .

예를 들어, 이것은 완전히 괜찮습니다:

command && echo 'command worked!' 

답변3

사람들은 실패에 대한 타당한 이유를 제시했습니다 echo. 정확성에 대한 이 점 외에도 가독성도 언급할 수 있습니다. 당신이 쓴

echo >&2 "error: cannot use MODE B in MODE A" && exit 1

머리 속에서 영어로 번역하면 다음과 같은 결과가 나옵니다.

다음을 표준 오류에 인쇄합니다. "오류: 모드 A에서 모드 B를 사용할 수 없습니다."
인쇄 작업이 성공적으로 완료되면 코드 1로 종료합니다.

이 글을 읽는 누군가는 "왜 굳이 지정하려고 합니까?"라고 물을 수도 있습니다.인쇄 작업이 성공적으로 완료되면이 경우 &&코드에 논리가 적기 때문에 이 두 줄이 더 간단합니다. 권장되는 두 줄 대안의 영어 버전은 다음과 같습니다.

다음을 표준 오류에 인쇄합니다. "오류: 모드 A에서 모드 B를 사용할 수 없습니다."
코드 1로 종료됩니다.

덜 복잡하므로 읽는 데 더 적은 두뇌가 필요합니다. 우리는 그것이 무엇인지 알고 싶지 않을 것입니다 &&.

답변4

한 줄에 두 개의 명령을 작성할 필요가 없습니다. if 문에 100개의 명령이 있으면 읽기가 좋지 않기 때문에 함께 &&하지 않을 것입니다. 에코 오류 가능성에 대한 다른 응답은 기술적으로 정확하지만 수석 개발자의 의도가 가독성을 위한 것인지 의심됩니다.

관련 정보