영호

[CLI] Linux CLI |(pipe), ||(or) 본문

개발지식

[CLI] Linux CLI |(pipe), ||(or)

0h0 2022. 5. 22. 11:20

들어가며

이번 글에서는 제가 프로젝트를 진행하며 에러를 수정하다 알게 된 CLI 관련된 | 연산과 || 연산의 차이에 대해 포스팅해보겠습니다.

 

에러 발생 상황

  • jenkins의 pipeline과 docker를 이용해 프로젝트 배포를 진행하는 상황.
  • 배포의 마지막 과정에서 Docker이미지를 실행하기 전, 아래 코드로 이미 실행 중이던 컨테이너가 존재하면 중지 및 삭제하는 명령어 실행.
docker ps -a -q --filter name={container} | grep -q . && docker stop {container}&& docker rm {container} | true
  • 그러나 해당 명령어에서 에러가 발행하면서 배포가 이루어지지 않음.
grep명령에서 -q 옵션은 출력을 하지 않는 옵션입니다.

| (pipe연산)

사용법

  • 이전 명령어의 output이 |(pipe) 연산으로 인해 다음 명령어의 input으로 들어갑니다.
  • 아래 코드처럼 명령어 사이에 | 연산을 집어넣어서 사용합니다.
command1 | command2

예제

  • test.txt
test
qwer
test
qwer

위와 같이 test.txt가 작성되어있는 상황에서 예제를 진행해보겠습니다.

cat test.txt | head -2
출력
test
qwer

cat test.txt의 output이 head -2의 input으로 들어가면서 젤 위 2행만 출력이 되는 것을 볼 수 있습니다.

 

|| (if else)

|| 연산은 저희가 알고 있는 if else와 매우 흡사합니다.

사용법

  • 만약 command1이 정상적으로 수행된다면 command2는 수행되지 않지만,
  • command1이 정상적으로 수행되지 않으면 command2가 수행됩니다.
  • 아래와 같은 형식으로 사용할 수 있습니다.
command1 || command2

예제

echo true || echo false

>>> true
  • echo true가 정상적으로 수행되기 때문에 true만 출력됩니다.
false || echo else

>>> else
  • 앞이 false라 뒤에 있는 echo else가 수행되면서 else가 출력됩니다.

에러 해결

docker ps -a -q --filter name={container} | grep -q . && docker stop {container}&& docker rm {container} || true
  • 마지막에 pipe라인으로 이루어진 것을 or연산으로 수정했습니다.
  • 만약 실행 중인 컨테이너 목록 중 찾는 컨테이너가 없을 경우 끝 부분의 || true로 인해 다음 명령어가 정상적으로 수행됩니다.
Comments