본문 바로가기
Linux

[Linux] Pipe(|)와 다중 명령어 (;, &&, ||)

by ds31x 2023. 9. 12.

| : Pipe

Pipe |는 2개의 processes를 연결해주는 연결 통로로서

  • pipe 앞의 프로세스의 stdout(표준출력)이
  • pipe 뒤의 프로세스의 stdin(표준입력)으로 쓰이도록 연결해주는 것임.

 

예를 들어 ls|sort|more의 경우 ls의 출력이 sort의 입력으로 들어가고, sort의 출력이 more의 입력으로 들어가게 된다.
이는 현재 디렉토리의 파일 및 sub-directory들의 리스트(ls)가 정렬(sort)이 되고 한 화면씩 출력(more)이 되는 결과를 얻게 됨.

 

다음의 예를 보자.

curl https://example.com 2> /dev/null | wc -l
  • URL https://example.com 의 웹페이지를 curl을 통해 stdout으로 출력하면서
  • 단, stderr는 무시하고 (curl의 경우 웹페이지 정보를 다운로드하는 과정을 출력하는 status message가 stderr로 보내짐)
  • curl의 stdout의 출력wc 프로세스의 stdin으로 pipe를 통해 연결함.
  • wc -l은 stdin으로 들어오는 text 입력의 line 수를 센다.

;: Semi-colon (or command separator)

C언어에서 한 line에 여러 statements를 기입할 경우 이를 구분하기 위해 semi-colon ;이 사용되는 것과 비슷하다.

  • 여러 commands를 한 line으로 기재할 수 있게 해주며, 앞에서부터 commands가 차례로 수행된다.
  • 주의할 점은 앞의 command가 실패하더라도 뒤의 commands가 실행이 된다는 점이다.
  • 일반적으로 하나의 line에 순서대로 수행되어야하는 여러 statements를 기재할 때 사용되나, 앞의 결과가 뒤에 영향을 주지 않는 경우에 사용되어야 한다.

&& : Double ampersand

앞서 semi-colon을 사용한 경우, 앞의 명령어가 실패해도 뒤의 명령어가 수행이 된다.

때문에 앞의 결과에 의해 영향을 받을 경우 문제가 생길 수 있다.

이 경우 상황에 따라  double ampersand나 double verticalbar 로 묶어주는게 좋다.

 

&&

  • semi-colon처럼 commands를 순서대로 실행시키지만,
  • 앞의 command가 수행 실패한 경우 뒤에 위치한 commands가 수행되지 않는다.
  • 이를 가르켜 short-circuit evaluation 이라고 부름

|| : Double verticalbar

C의 조건문에서 &&는 and이고 ||가 or로 사용되는 것을 shell에서도 같이 이용한다고 보면 된다.

 

||앞의 명령의 결과가 실패할 경우, 뒤의 명령어가 실행된다.


참고 : redirection <, >, >>

redirection과 pipe 는 구분해야 한다.

redirection은 특정 process의 I/O를 stdin 과 stdout이 아닌 다른 stream으로 변경할 때 사용한다.

  • 출력을 stdout(표준출력으로 보통 모니터)가 아닌 file에 저장하는 경우.
  • 입력을 stdin(표준입력으로 보통 키보드)가 아닌 file로 지정.

>는 출력을 변경하고 새로 기재하는 것이고 >>는 출력을 변경하되 기존의 내용을 놔두고 덧붙이는(append)의 동작을 수행.
<는 입력을 변경하는 형태로 동작한다.

2023.10.02 - [Linux] - [Bash] 입출력 목적지 변경하기 : Redirection Operation

 

[Bash] 입출력 목적지 변경하기 : Redirection Operation

stdout (표준출력, 1), sdtin(표준입력, 0), stderr(표준에러, 2)을 redirection하는 방법에 대한 문서 서버에서 백그라운드로 명령어 수행시 출력이나 error 메시지 등을 stdout이 아닌 file에 남길 때 유용. redir

ds31x.tistory.com

 

728x90