grep에서 반환된 개수를 어떻게 되돌릴 수 있나요?

grep에서 반환된 개수를 어떻게 되돌릴 수 있나요?

테스트 스크립트를 작성 중입니다. 다른 테스트가 있을 때 특정 테스트를 실행하고 싶습니다.확실히반품 실패. 이것은 내가 사용하고 이를 쉘 스크립트 변수에 할당하는 기본 테스트입니다.

cpp -dM -fsanitize=undefined < /dev/null 2>&1 | grep -i -c error

GCC 4.8 또는 Clang 3.2(또는 그 이상)의 경우 정의되지 않은 동작 클리너를 사용할 수 있으며 반환 값은 grep0입니다. 컴파일러의 경우부족지원되는 경우 값은 0이 아닙니다. 예를 들어:

# Clang 3.1
$ cpp -dM -fsanitize=undefined < /dev/null
clang: error: unsupported argument 'undefined' to option 'fsanitize='

만약에grep -v -c나는 다음 줄을 사용해 보았습니다 .불일치전처리기에 의해 덤프된 라인 수를 효과적으로 계산하는 "오류"를 계산합니다. 따라서 내가 얻는 결과는 248(오류 없음)과 1(오류 있음)이지만, 실패하면 0 값을 얻지 못합니다.

나중에가독성, 나는 다음을 실행합니다:

if [ "$HAVE_UBSAN" -ne "0" ]; then
  export CXXFLAGS="-DNDEBUG -g2 -O2 -fsanitize=undefined $MY_CXXFLAGS"
  make ...
  # Run self tests, scrape output for failures
fi

문제는 가독성을 유지하기 위해 테스트에서 반환된 개수를 무효화해야 한다는 것입니다 grep -c error. 즉, 결과를 0(없음) 또는 0이 아닌(무언가)로 바꿔야 합니다.

C/C++에서는 다음과 같은 작업을 수행합니다(참고!표현에 관해서):

!(`cpp -dM -fsanitize=undefined < /dev/null 2>&1 | grep -i -c error`)

에서 반환된 개수를 어떻게 되돌리나요 grep?


아니요Valgrind 테스트에는 count를 직접 사용할 수 있기 때문에 이 문제가 있습니다.

 HAVE_VALGRIND=`which valgrind | grep -i -c valgrind`

답변1

이러한 경우 cpp의 반환 값을 직접 확인할 수 있습니다.

HAVE_UBSAN=$(cpp -dM -fsanitize=undefined < /dev/null > /dev/null 2>&1 && echo 1)
if [ "$HAVE_UBSAN" = 1 ]
. . .

심지어

if cpp -dM -fsanitize=undefined < /dev/null > /dev/null 2>&1
then
    export CXXFLAGS="-DNDEBUG -g2 -O2 -fsanitize=undefined $MY_CXXFLAGS"
    make ...
    # Run self tests, scrape output for failures
fi

또는 질문의 요점으로 돌아가서 비교 요점을 무효화하려면, 즉 제공한 C++ 예제와 매우 유사한 cpp의 실패를 확인하려면 다음을 사용하십시오 !.

    if ! cpp -dM -fsanitize=undefined < /dev/null > /dev/null 2>&1
    then
        echo 'NO sanitizer'
    fi

비슷한 기술을 사용하여 VALGRIND를 설정할 수 있습니다.

    VALGRIND=$(which valgrind > /dev/null && echo 1)

C++를 알고 &&있으므로 ||. 이는 쉘 명령줄에서도 유사하게 작동합니다. 위에서 which valgrind > /dev/null성공하면 "1"이 에코됩니다.

관련 정보