Recentemente, quando li um QA , ele apresentou alguns comportamentos inesperados para mim:
~/findtest % echo three > file\ with\ \"double\ quotes\"
~ % find findtest -type f -exec sh -c 'set -x;cat "{}"' \;
+ cat 'findtest/file with double' quotes
cat: findtest/file with double: No such file or directory
cat: quotes: No such file or directory
IMHO quando a substituição estiver concluída, ela funcionará 'cat findtest/file\ with\ \"double\ quotes\"'
se apenas substituir o nome do arquivo acima, file\ with\ \"double\ quotes\"
o que funcionará. Se mantivermos o wrapper de citação, ele mostrará:
$ cat "findtest/file\ with\ \"double\ quotes\""
cat: 'findtest/file\ with\ "double\ quotes"': No such file or directory
P:
O que essa substituição realmente faz, causando o comportamento um pouco estranho acima com 2 substr 'findtest/file with double' e 'quotes', mas não 'findtest/file with' e 'double quotes' "
como delimitador?
O comportamento que você está vendo não é o resultado do
find
processamento de "caracteres especiais" do 's (aspas não são especiais parafind
), é o resultado dosh
's. O nome do arquivo éfile with "double quotes"
; as barras invertidas são escapes destinados ao shell, elas não aparecem no sistema de arquivos efind
não sabem sobre elas.Por isso
funciona como esperado:
find
encontrafindtest/file with "double quotes"
e constrói a invocação decat
com esse argumento;cat
abre e tudo funciona.Agora, quando você adiciona
sh
na mistura,find
faz exatamente a mesma coisa: comfind
cria uma invocação desh
com os argumentos-c
seguidos porset -x; cat "findtest/file with "double quotes""
.sh
processa as aspas, resultando em uma invocação decat
com os argumentosfindtest/file with double
equotes
:Os pares de aspas delimitam
findtest/file with
(com um espaço à direita) e a string vazia. Como não há espaço entre a segunda aspa dupla edouble
, isso é concatenado no mesmo argumento; o espaço entredouble
equotes
não ocorre dentro de um par de aspas, então ele separa palavras. Assim, após a remoção das aspas e a divisão de palavras, os componentes da linha de comando sãocat
findtest/file with double
quotes