TL; DR :와 같은 구분 기호를 나열합니다 ;. &, &&및 ||구문 분석 순서를 결정하십시오.
배쉬 설명서는 우리에게 알려줍니다 :
AND 및 OR 목록은 && 및 ||로 구분 된 하나 이상의 파이프 라인 시퀀스입니다. 각각 제어 연산자.
또는 Bash Hacker의 Wiki가 간결하게 넣는 방법
<PIPELINE1> && <PIPELINE2>
따라서 cd ~/screenshots/ && ls screenshot* | head -n 5 하나의 파이프 라인 ls screenshot* | head -n 5과 하나의 간단한 명령이 cd ~/screenshots/있습니다. 설명서에 따라
파이프 라인의 각 명령은 별도의 프로세스 (즉, 서브 쉘)로 실행됩니다.
반면에 (cd ~/screenshots/ && ls screenshot*) | head -n 5하나의 파이프 라인이 있습니다. 왼쪽에는 서브 쉘이 있고 오른쪽에는 있습니다 head -n 5. 이 경우 OP의 표기법을 사용하면(A && B) | C
다른 예를 보자.
$ echo foo | false && echo 123 | tr 2 5
$
여기에 하나의 목록이 <pipeline1> && <pipeline2>있습니다. 파이프 라인의 종료 상태는 마지막 명령의 종료 상태와 같고 false실패라고하는 음의 상태를 반환 &&하므로 오른쪽을 실행하지 않습니다.
$ echo foo | true && echo 123 | tr 2 5
153
여기서 왼쪽 파이프 라인은 성공 종료 상태이므로 오른쪽 파이프 라인이 실행되고 출력이 표시됩니다.
쉘 문법은 실제 실행 순서를 의미하지 않습니다. Gilles의 답변 중 하나를 인용하려면 :
파이프 된 명령은 동시에 실행됩니다. ps를 실행할 때 | grep…, ps 또는 grep이 먼저 시작하는지 여부에 대한 추첨의 행운 (또는 쉘의 작업에 대한 세부 사항이 커널의 창자에 깊숙이 미세 조정 됨) 동시에 실행합니다.
그리고 bash 매뉴얼에서 :
AND 및 OR 목록은 왼쪽 연관성으로 실행됩니다.
에 그 바탕으로 cd ~/screenshots/ && ls screenshot* | head -n 5은 cd ~/screenshots/, 먼저 실행된다 ls screenshot* | head -n 5이전 명령이 성공하면,하지만 head -n 5첫 번째 프로세스가 아닌 산란 수 있습니다 ls그들은 파이프 라인에 있기 때문에.
|LHS stdout을 RHS stdin에 맞추는 커넥터에 불과 하다는 것이 도움이 될 수 있습니다 . 따라서cd예제 의 명령이 실패하면에 출력을 보내지head않지만head실제로는 여전히을execute구문 분석하고 아무것도 구문 분석하지 않고 출력을 반환하지 않습니다.