`;`와 `&&`, `|` 사이에 차이가 있나요? [복사]

`;`와 `&&`, `|` 사이에 차이가 있나요? [복사]

여러 명령을 실행하려면 ;, &&|

다음과 같습니다: killall Finder; killall SystemUIServer, cd ~/Desktop/ && rm Caches또는: man grep | man cat예를 들어.

|그런데 ;와 의 차이가 있나요 &&? 그렇다면 차이점은 무엇입니까?

답변1

  • ;: a로 구분된 명령이 ; 순서대로 실행됩니다. 쉘은 각 명령이 차례로 종료될 때까지 기다립니다.

  • &&: 이후 명령은 이전 명령이 종료 상태 0을 반환하는 경우에만 &&실행됩니다 . 운영자 &&라고 생각하시면 됩니다 .AND

  • |: 파이프라인. 표현식에서 command1 | command2command1의 표준 출력은 command2의 표준 입력으로 파이프됩니다.

언급할 가치가 있는 유사한 제어 연산자가 더 많이 있습니다.

  • ||: 이후 명령은 ||이전 명령이 0이 아닌 종료 상태를 반환하는 경우에만 ||실행됩니다 . OR운영자 라고 생각하시면 됩니다 . 와 는 |완전히 ||다른 동물입니다.

  • &: 쉘은 &명령이 완료될 때까지 기다리지 않고 백그라운드에서 종료된 명령을 실행하고 즉시 종료 코드 0을 반환합니다. 다시 &말하지만 &&.

  • |&2>&1 |: 즉, command1의 표준 출력과 표준 오류가 파이프를 통해 command2의 표준 입력에 연결됩니다.

또한 then을 사용하는 경우 또는 을 사용하여 명령을 시작할 zsh수도 있습니다 . 이 경우 작업은 즉시 거부되고 시작된 후에는 작업 테이블에 자리가 없습니다.&|&!

답변2

두 가지 명령을 고려 A하고 B. 당신이 글을 쓸 때

A | B

A과 는 B병렬로 실행되며 의 표준 출력이 A의 표준 입력으로 전송됩니다 B.

당신이 글을 쓸 때

A; B

A실행된 다음 B실행됩니다( 0이 아닌 종료 상태로 set -e사용되고 A종료되지 않은 경우, 쉘은 즉시 종료됩니다 A).

당신이 글을 쓸 때

A && B

A실행되고 성공적으로 종료된 경우에만(0 종료 상태) B. A이 양식은 이전 양식보다 안전합니다.

cd some_dir && rm file*

&&올바른 파일을 삭제했는지 확인하세요 . 즉, cd성공한 경우에만 파일을 삭제하세요.

답변3

|다른 답변은 이미 , &&및 에 설명되어 있으므로 ;명시적으로 요청하지 않은 몇 가지 추가 사항을 추가하겠습니다 ||.

A || B

A실행되고, B실패할 때만 실행됩니다. A이는 오류 조건에 대응하는 데 유용합니다.

martin@martin ~ % rm doesnotexist 2>/dev/null || echo "failed to delete file"
failed to delete file

( 자체 오류 메시지를 2>/dev/null숨길 필요가 있습니다 .)rm

답변4

실제 예를 고려할 때 각 예를 사용하려는 이유를 아무도 설명하지 않는 것 같습니다. 나는 이것을 시도할 것이다:

killall Finder; killall SystemUIServer

이와 같은 명령을 killall실행하는 데 시간이 걸릴 수 있습니다. 세미콜론을 사용하면 동시에 두 개의 명령을 실행한 다음 기다리는 동안 다른 작업을 수행할 수 있습니다. 이렇게 하면 두 번(각 명령마다 한 번씩) 기다릴 필요가 없습니다.

cd ~/Desktop/ && rm Caches

~/Desktop/Caches디렉토리를 삭제 하고 그 디렉토리로 들어가고 싶습니다 ~/Desktop. 당신이 하고 싶지 않은 것은 (변경하기 전에) 현재 디렉토리에서 Caches 디렉토리를 제거하는 것입니다. 따라서 &&삭제 명령을 실행하기 전에 디렉터리 변경이 성공했는지 확인해야 합니다.

man grep | man cat

이것은 나에게 이해가 되지 않습니다. 이 man명령은 입력을 처리하지 않으므로 여기에 파이프하면 아무 작업도 수행되지 않습니다. 아마도 당신 말은

man grep || man cat

맨페이지를 찾으려고 시도하고 grep, 찾지 못하면 맨페이지를 표시합니다 cat. 아니면 당신이 말하는 것일 수도 있습니다

man grep | cat

cat이는 호출기(보통 ) 대신 매뉴얼 페이지를 표시하는 데 사용됩니다 less. |출력을 man명령으로 리디렉션합니다 cat(모든 내용을 화면에 덤프). 이는 less에서 키보드 명령을 사용하는 대신 스크롤 막대를 사용하여 파일에서 앞뒤로 이동할 수 있는 GUI에서 유용합니다.

; && | ||참고: 보다 일반적인 경우에 무엇을 해야 할지 알고 싶다면 jimmij의 답변을 살펴보는 것이 좋습니다. 나는 질문 예에서 무슨 일이 일어나고 있는지 설명하고 싶습니다.

관련 정보