명령을 연결할 때 "&&"와 ";"의 차이점은 무엇입니까

명령을 연결할 때 "&&"와 ";"의 차이점은 무엇입니까

다음 명령 연결 방법의 차이점은 무엇입니까?

cmd1; cmd2
cmd1 && cmd2

답변1

가 있다고 가정합니다 command1 && command2.

이 경우 command2종료 상태 0이 반환되는 경우에만 실행이 발생합니다.command1

;단지 명령 구분 기호입니다. 따라서 반환된 내용은 모두 command2실행됩니다 .command1

$> [[ "a" = "b" ]] && echo ok 

$> [[ "a" = "b" ]]; echo ok 
ok

답변2

cmd1; cmd2실행 cmd1, 그러면 cmd2무슨 일이 있어도. 이는 cmd1및 를 cmd2별도의 줄에 두는 것과 정확히 동일합니다. 이 복합 명령의 반환 상태는 의 반환 상태입니다 cmd2.

cmd1 && cmd2Execute cmd1. 그리고 종료 상태가 cmd10 이면 cmd2실행합니다. 이 복합 명령의 반환 상태는 cmd10이 아닌 경우(따라서 실행되지 않은 경우)이고, 그렇지 않은 경우 상태 (실행된 경우) cmd2를 반환합니다 .cmd2

if cmd1; then cmd2; fi대부분의 경우 동일합니다 cmd1 && cmd2. 주요 차이점은 0 if이 아닌 상태가 반환되면 버전이 0을 반환한다는 것입니다.cmd1

이 명령은 성공 시 0을 반환하고 실패 시 0이 아닌 오류 코드(1에서 255 사이, 일반적으로 더 높은 값은 다른 의미를 갖기 때문에 1에서 125 사이)를 반환합니다. 따라서 cmd1; cmd2이는 "무슨 일이 있어도 이 명령을 순서대로 실행"을 의미하는 반면, cmd1 && cmd2"이 명령을 실행하지만 첫 번째 명령이 실패하면 즉시 중지"를 의미합니다.

명령 쉘을 실행하여 "오류 종료" 모드로 들어갈 수 있습니다 set -e. 이 모드에서는 조건 구문( &&or의 왼쪽, ||and의 조건 부분) 을 제외하고 명령이 0이 아닌 상태를 반환할 때마다 쉘이 종료됩니다. 따라서 under , (또는 newline)은 실제로 ²와 동일합니다.ifwhileset -e;&&

1 제어 흐름에 관한 한 그게 전부입니다. 뉴라인과 세미콜론은 정확히 같은 방식으로 수행되지만 정확히 같은 방식으로 구문 분석되지는 않습니다. 예를 들어 파서가 별칭 정의를 실행하기 전에 별칭 확인을 수행하기 때문에 alias ls=true; ls수행 ls되지 않습니다truels
. 1 이는 .eg를 추가한다고 해서 우선순위가 보다 낮으므로 동등 하다는 의미는 아닙니다 . 또한, 서브쉘과의 상호작용은 끔찍합니다. 세부 사항으로 인해 이 답변이 너무 멀어질 것입니다.&&;set -e;&&cmd1 && cmd2 || cmd3set -e; { cmd1; cmd2; } || cmd3set -e

답변3

첫 번째 줄은 첫 번째 명령의 성공 여부에 관계없이 명령을 하나씩 실행합니다. 두 번째 줄은 셸 논리의 예입니다. 첫 번째 명령이 성공한 경우에만 두 번째 명령을 실행합니다. 이는 &&논리적이기 때문이다 and. 따라서 첫 번째 명령이 실패하면 전체 라인의 논리 상태가 거짓인 것으로 알려져 두 번째 명령을 평가할 필요가 없습니다.

답변4

보다 현실적으로는 차이가 있습니다.

cd /backup/old; rm -rf -- *

그리고

cd /backup/old && rm -rf -- *

. 그 외에 이것은 어리석은 접근 방식입니다. 첫 번째 방법은 성공이나 실패 rm에 관계없이 cd실행되므로 전체 파일 시스템(또는 호출 방법에 따라 $HOME)을 삭제합니다.

관련 정보