Eu provavelmente faria algo assim:
john --incremental:all -stdout | while read pass;do
rar x -p"${pass}" test2.rar
if [ "$?" -eq 0 ];then
exit 0
fi
done
Substitua as opções rar, etc., conforme desejado. Desta forma, o comando só é executado até que ele descompacte o arquivo com sucesso e você não precise fazer uma pesquisa. $?
é uma variável do shell que contém o código de retorno do último comando de execução e, se executado com êxito, é igual a 0. Então, se você corresponder com 0, saberá que o comando anterior "funcionou".
Editar 1 : "" é adicionado à volta da palavra-passe, como -p"${pass}"
.