Isso porque a mensagem de erro está sendo enviada para o fluxo STDERR (descritor de arquivo 2), não para STDOUT (descritor de arquivo 1) que você está capturando com a substituição de comando $()
.
Concentre-se apenas em obter a string, seja em STDOUT ou STDERR:
test="$(redis-cli exit 2>&1)"
Nesse caso, o teste [ -z "$test" ]
resultará em falsos positivos, pois a mensagem de erro será armazenada na variável. Em vez disso você pode fazer:
#!/bin/bash
test="$(redis-cli exit 2>/dev/null)"
if [[ -z $test ]] ; then
echo "I'm empty :("
fi
Também acho que isso deve ser o que você quer, já que o status de saída é trivial:
if redis-cli exit &>/dev/null; then
echo 'Succeeded!!'
else
echo 'Failed!!'
fi