Você pode redefinir o widget accept-line
zle
para fazer todas as verificações desejadas:
accept-line() {
if [[ $BUFFER =~ '^gcc.*-o\s*\S*\.c\b' ]]; then
zle -M 'I will not do that!'
else
zle .$WIDGET "$@"
fi
}
zle -N accept-line