Isso parece correto se você quiser ignorar shared na raiz da árvore de diretórios, ou seja, se você estiver ignorando um dos $base_directories . Mas se você quisesse ignorar shared em algum lugar mais profundo na hierarquia, você precisa de -F "(shared **shared)" . Você também pode colocar os padrões em uma matriz, o que reduzirá as dores de citação.
local -a ignored base_directories
base_directories=(…)
ignored=(shared '*/shared')
_path_files -W base_directories -/ -F ignored
Há exemplos na distribuição padrão em _cvs e _darcs .
Se isso não ajudar, tente investigar o que está acontecendo adicionando set -x e set +x em torno do código problemático ou setopt local_options xtrace (também conhecido como set -x e altere as opções apenas pela duração da função atual) .