? é um glob (padrão, curinga) que corresponderá a nomes de arquivos que consistem exatamente em um caractere; ele é substituído pelos arquivos correspondentes no diretório atual. Se não houver arquivos correspondentes no diretório atual, ? permanecerá inalterado e sua função será acionada. Isso é chamado de expansão do nome do caminho em man bash e expansão do nome do arquivo no manual de referência bash
Nesse caso, aparentemente, você tem um arquivo chamado 0 no diretório atual, portanto, ? foo é alterado para 0 foo pela expansão pathaname e, em seguida, ele tenta executar um comando chamado 0 with foo como argumento. Se você remover / renomear esse arquivo para algo maior que um caractere, sua função deve começar a funcionar. Como alternativa, você pode usar \? ou "?" ou '?' para evitar que ele seja tratado como um glob.
Em uma nota lateral, usar ? em um nome de função não está documentado e não é recomendado. Somente alfanuméricos e sublinhados são documentados para funcionar (o mesmo que é permitido para nomes de variáveis ).