Há algumas coisas erradas com este trecho, mas, surpreendentemente, a verificação de arquivo duplo não é uma delas.
Primeiro, a construção $()
em torno de find
está errada, como mostra @EricRenouf. A maneira correta de fazer isso seria usar algo como
while read filename
do
source $filename
done < <(find ....)
que as chamadas localizam em um subshell e lê nomes de arquivos em uma variável filename
no shell principal (é a idéia de find | while read x
em sua cabeça, mas infelizmente não é tão portátil)
Em segundo lugar, o teste do diretório -d
é redundante; find
não encontrará nenhum arquivo se o diretório não existir, então testar sua existência não faz sentido.
No entanto, o argumento -type f
para find
não testa exatamente a mesma coisa que o argumento -f
para test
. O POSIX tem as seguintes para dizer sobre test
:
-f pathname
True if pathname resolves to an existing directory entry for a regular file. False if pathname cannot be resolved, or if pathname resolves to an existing directory entry for a file that is not a regular file.
e tem para dizer sobre find
:
-type c
The primary shall evaluate as true if the type of the file is c, where c is 'b', 'c', 'd', 'l', 'p', 'f', or 's' for block special file, character special file, directory, symbolic link, FIFO, regular file, or socket, respectively.
Portanto, se você tiver um arquivo regular que "não pode ser resolvido", terá um arquivo para o qual test -f
falhará, mas find -type f
será bem-sucedida. Uma maneira de fazer isso é ter um arquivo em um diretório que você possa ler, mas que você não pode acessar:
wouter@gangtai:~$ ls -ld foo
drw-r--r--. 2 wouter wouter 4096 apr 1 18:38 foo
wouter@gangtai:~$ find foo -type f | while read file; do if [ -f $file ]; then echo $file tests -f; else echo $file does not test -f; fi; done
foo/bar does not test -f
wouter@gangtai:~$ ls -l foo
ls: cannot access 'foo/bar': Permission denied
total 0
-????????? ? ? ? ? ? bar
O tipo do arquivo (seja um diretório, um arquivo regular ou qualquer outro) pode ser detectado se você tiver r
, mas não x
, permissões no diretório em qual o arquivo é armazenado. No entanto, para poder "resolvê-lo" (ou seja, chamar uma das funções stat()
nesse arquivo), você precisa do bit de permissão x
nesse diretório.
Naturalmente, se fazer um teste em um shell script para seu .bashrc
é útil é uma questão diferente. Eu diria que não. No entanto, isso não significa que os dois testes são os mesmos, e são casos em que essa diferença é importante ...