
다음 명령 연결 방법의 차이점은 무엇입니까?
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 && cmd2
Execute cmd1
. 그리고 종료 상태가 cmd1
0 이면 cmd2
실행합니다. 이 복합 명령의 반환 상태는 cmd1
0이 아닌 경우(따라서 실행되지 않은 경우)이고, 그렇지 않은 경우 상태 (실행된 경우) 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)은 실제로 ²와 동일합니다.if
while
set -e
;
&&
1 제어 흐름에 관한 한 그게 전부입니다. 뉴라인과 세미콜론은 정확히 같은 방식으로 수행되지만 정확히 같은 방식으로 구문 분석되지는 않습니다. 예를 들어 파서가 별칭 정의를 실행하기 전에 별칭 확인을 수행하기 때문에 alias ls=true; ls
수행 ls
되지 않습니다true
ls
. 1 이는 .eg를 추가한다고 해서 우선순위가 보다 낮으므로 동등 하다는 의미는 아닙니다 . 또한, 서브쉘과의 상호작용은 끔찍합니다. 세부 사항으로 인해 이 답변이 너무 멀어질 것입니다.&&
;
set -e
;
&&
cmd1 && cmd2 || cmd3
set -e; { cmd1; cmd2; } || cmd3
set -e
답변3
첫 번째 줄은 첫 번째 명령의 성공 여부에 관계없이 명령을 하나씩 실행합니다. 두 번째 줄은 셸 논리의 예입니다. 첫 번째 명령이 성공한 경우에만 두 번째 명령을 실행합니다. 이는 &&
논리적이기 때문이다 and
. 따라서 첫 번째 명령이 실패하면 전체 라인의 논리 상태가 거짓인 것으로 알려져 두 번째 명령을 평가할 필요가 없습니다.
답변4
보다 현실적으로는 차이가 있습니다.
cd /backup/old; rm -rf -- *
그리고
cd /backup/old && rm -rf -- *
. 그 외에 이것은 어리석은 접근 방식입니다. 첫 번째 방법은 성공이나 실패 rm
에 관계없이 cd
실행되므로 전체 파일 시스템(또는 호출 방법에 따라 $HOME)을 삭제합니다.