특정 도커 컨테이너가 실행 중인지 확인하는 간단한 셸 스크립트가 있습니다. 쉘 스크립트에는 다음 줄이 있습니다.
RUNNING_CONTAINERS=$(docker ps -a | grep ${IMAGE_NAME})
grep이 결과를 반환하지 않으면 쉘 스크립트가 바로 종료됩니다. grep의 결과가 비어 있어도 스크립트가 계속 실행되도록 스크립트를 작성하려면 어떻게해야합니까?
그 이유는 set -e
코드 어딘가에 존재 하기 때문에 명령이 0이 아닌 상태를 반환하는 즉시 스크립트가 종료됩니다. 이 경우 grep
일치하는 항목을 찾지 못했기 때문입니다.
에서 읽으면서 배쉬 참조 설명서 ->를 set
내장
-e
단일 명령 (단순 명령 참조), 목록 (목록 참조) 또는 복합 명령 (복합 명령 참조)으로 구성 될 수있는 파이프 라인 (파이프 라인 참조)이 0이 아닌 상태를 반환하면 즉시 종료합니다. 실패한 명령이 while 또는 until 키워드 바로 뒤에 오는 명령 목록의 일부, if 문에서 테스트의 일부, && 또는 ||에서 실행되는 명령의 일부인 경우 쉘은 종료되지 않습니다. 마지막 && 또는 || 뒤에 오는 명령, 파이프 라인에 있지만 마지막 명령을 제외한 모든 명령 또는 명령의 반환 상태가!로 반전되는 경우 -e가 무시되는 동안 명령이 실패하여 서브 쉘 이외의 복합 명령이 0이 아닌 상태를 리턴하면 쉘이 종료되지 않습니다. ERR에 대한 트랩이 설정된 경우 쉘이 종료되기 전에 실행됩니다.
또한에서 man grep
:
종료 상태
일반적으로 종료 상태는 라인이 선택된 경우 0, 라인이 선택되지 않은 경우 1, 오류가 발생한 경우 2입니다. 그러나 -q 또는 --quiet 또는 --silent를 사용하고 라인을 선택한 경우 오류가 발생하더라도 종료 상태는 0입니다.
따라서 grep
아무것도 찾지 못하고 0이 아닌 종료 상태를 반환합니다. 그런 다음이를 set -e
캡처하고 "예외"( if
, while
... 참조에서 언급 한대로)에서 비롯되지 않았는지 확인 하고 파이프 라인의 마지막 명령 이전이 아니므로 종료합니다.
매우 기본적인 스크립트를 만들어 보겠습니다.
$ cat a.sh
#!/bin/bash
set -e
echo "hello"
grep "hello" a
echo "bye"
그리고 빈 a
파일을 생성 합니다.
$ touch a
실행하면 grep
결과가 반환되지 않을 때 종료됩니다 .
$ ./a.sh
hello
그러나 set -e
행 을 제거 하면 파일 끝까지 이동합니다.
$ ./a.sh
hello
bye
grep
파이프 라인의 마지막 요소가 아닌 경우 실패하지 않습니다 .
$ cat a.sh
#!/bin/bash
set -e
echo "hello"
grep "hello" a | echo "he"
echo "bye"
$ ./a.sh
hello
he
bye
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다