Se não houver nada no diretório foo , a variável file receberá o valor literal foo/* . A substituição ${file##*/} produzirá a string * e, com echo , todos os nomes serão exibidos no diretório atual.
Para corrigir isso em bash , a opção mais simples seria definir a opção nullglob shell com shopt -s nullglob . Isso garante que a globbing do nome do arquivo não se expanda para o próprio padrão se não houver nomes correspondentes ao padrão.
Do manual bash :
nullglobIf set,
bashallows patterns which match no files (see Pathname Expansion above) to expand to a null string, rather than themselves.
Eu gostaria que o manual usasse "nomes" ou possivelmente "nomes de arquivos" em vez de "arquivos".