Nestes casos, você pode verificar o valor de retorno do cpp diretamente:
HAVE_UBSAN=$(cpp -dM -fsanitize=undefined < /dev/null > /dev/null 2>&1 && echo 1)
if [ "$HAVE_UBSAN" = 1 ]
. . .
ou até mesmo
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
alternativamente, e chegando ao ponto de sua pergunta, para negar o sentido da comparação, isto é, para verificar a falha do cpp, é muito semelhante ao exemplo de C ++ que você deu, use !
:
if ! cpp -dM -fsanitize=undefined < /dev/null > /dev/null 2>&1
then
echo 'NO sanitizer'
fi
Uma técnica semelhante pode ser usada para definir VALGRIND:
VALGRIND=$(which valgrind > /dev/null && echo 1)
Como você conhece o C ++, você estará familiarizado com &&
e ||
. Eles funcionam de forma semelhante na linha de comando do shell. Acima, se which valgrind > /dev/null
for bem sucedido, então "1" será ecoado ..