차이점이 뭐야
echo "Hello " ; echo "world"
그리고
echo "Hello " && echo "world"
둘 다 서로 두 명령을 실행하는 것 같습니다.
답변1
echo "Hello" ; echo "world"
echo "world"
이전 명령의 종료 상태에 관계없이 명령이 순차적으로 실행됨을 나타냅니다 echo "Hello"
. 즉, echo "world"
이전 명령의 성공 여부와 상관없이 실행됩니다 echo "Hello"
.
의 경우 echo "Hello" && echo "world"
첫 번째 명령()이 성공하는 경우(즉, 상태 0으로 종료되는 경우)에만 실행됩니다 echo "world"
. echo "Hello"
이것은 ... 불리운다단락 평가.
다음 예는 쉘이 다양한 연산자를 사용하여 명령 체인을 처리하는 방법을 보여줍니다.
$ false ; echo "OK"
OK
$ true ; echo "OK"
OK
$ false && echo "OK"
$ true && echo "OK"
OK
$ false || echo "OK"
OK
$ true || echo "OK"
$
마지막 케이스는 OK
단락되어 인쇄되지 않았습니다 true
.
간단히 말해서 ;
구분 기호이고 &&
논리적 AND이며 ||
논리적 OR입니다(자세히 읽어보세요).여기).
답변2
Linux의 모든 명령은 실행이 완료되면 종료 코드를 반환합니다. 종료 코드는 특수 변수에 할당되므로 ?
마지막 명령의 상태를 쉽게 확인할 수 있습니다 echo $?
. 이는 스크립트에서 자주 사용됩니다. 명령이 성공적으로 완료되면 종료 코드 0이 반환되고, 실행 중에 오류가 발생하면 종료 상태는 0이 아닙니다. 아래 예를 참조하세요.
$ 에코 "안녕하세요" 안녕하세요 $에코$? 0 $ rm 파일이 존재하지 않습니다. rm: '존재하지 않는 파일'을 삭제할 수 없습니다. 해당 파일이나 디렉터리가 없습니다. $에코$? 1
이제 이것이 귀하의 질문으로 이어집니다. 이는 &&
"이전 명령이 성공한 경우에만 다음 명령을 실행합니다. 즉, 종료 코드 0을 반환합니다"를 의미하는 특수 연산자입니다. 이전 명령이 실패할 경우에만 후자의 명령을 실행하는 역방향 연산자도 있습니다 ||
. 즉, 0이 아닌 값으로 종료됩니다. 아래 예를 참조하세요.
$ echo "안녕하세요" && echo "이전 명령이 성공했습니다" 안녕하세요 이전 명령이 성공했습니다. $ rm 존재하지 않는 파일 && echo "이 내용은 인쇄되지 않습니다." rm: '존재하지 않는 파일'을 삭제할 수 없습니다. 해당 파일이나 디렉터리가 없습니다. $rm 존재하지 않는 파일|| echo "그러나 이것은 표시될 것입니다" rm: '존재하지 않는 파일'을 삭제할 수 없습니다. 해당 파일이나 디렉터리가 없습니다. 하지만 이건 보여줄 거야
편집: 질문은 둘 사이의 차이점에 관한 것이므로 &&
완전한 ;
답변을 얻으려면 한 명령을 다른 명령과 구분하기 위해 세미콜론을 추가해야 합니다. 종료 코드는 확인되지 않으므로 세미콜론으로 구분된 여러 명령이 있는 경우 단순히 순차적으로, 즉 서로 완전히 독립적으로 하나씩 실행됩니다.
답변3
또한@heemayl의 답변, &&
(및 ||
)은 쉘이 처리만 수행하도록 합니다.하나의모든 링크 명령에 대한 종료 코드입니다. 따라서 trap [...] ERR
또는 줄이 있으면 set -o errexit
종료 코드 처리를 수행하기 전에 모든 명령을 처리합니다.