Lista de comandos errada

1

Eu tenho um script bash que lista todos os arquivos em um diretório:

for file in foo/*; do
  echo ${file##*/}
done

Ele funciona bem se houver arquivos no diretório, mas se não houver arquivos, ele listará os arquivos em um diretório.

Como posso corrigir isso?

    
por Jakob Kenda 03.08.2016 / 14:59

1 resposta

1

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 :

nullglob

If set, bash allows 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".

    
por 03.08.2016 / 15:06

Tags