여러 명령을 실행하려면 ;
, &&
및|
다음과 같습니다: killall Finder; killall SystemUIServer
, cd ~/Desktop/ && rm Caches
또는: man grep | man cat
예를 들어.
|
그런데 ;
와 의 차이가 있나요 &&
? 그렇다면 차이점은 무엇입니까?
답변1
;
: a로 구분된 명령이;
순서대로 실행됩니다. 쉘은 각 명령이 차례로 종료될 때까지 기다립니다.&&
: 이후 명령은 이전 명령이 종료 상태 0을 반환하는 경우에만&&
실행됩니다 . 운영자&&
라고 생각하시면 됩니다 .AND
|
: 파이프라인. 표현식에서command1 | command2
command1의 표준 출력은 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의 답변을 살펴보는 것이 좋습니다. 나는 질문 예에서 무슨 일이 일어나고 있는지 설명하고 싶습니다.