$ find -name "Bik*"
./Biking
./Biking/Unsync/Biking.md.~6~
./Biking/Rendered/Biking.gen.html
./Biking/Biking.md
Agora, quando substituo a expressão por uma variável da seguinte forma:
$ a='-name "Bik*"'
$ find $a
Não recebo saída. Por que é tão? E o que deve ser modificado?
(A menos que você esteja usando
zsh
como seu shell interativo...) O problema é que as aspas duplas serão tomadas como parte do padrão. O comando que você está realmente executando seria o equivalente aVocê obtém isso porque o shell executaria a divisão de palavras no unquoted
$a
, dividindo a string entre as duas palavras-name
e"Bik*"
. As palavras então passam por geração de nome de arquivo ("globbing"), o que significa que"Bik*"
seria expandido para todos os nomes de arquivo correspondentes a esse padrão específico no diretório atual (incluindo as aspas duplas). É improvável que você tenha esses nomes de arquivo, portanto, o padrão permanece não expandido e as aspas permanecem.Se você tivesse usado
a='-name Bik*'
, teria funcionado , mas apenas se você não tivesse nada correspondenteBik*
no diretório atual.Se, em
bash
, você tivesse usadoshopt -s nullglob
, ambas as tentativas resultariam em um erro defind
como-name
não receberia um padrão (o shell removeria os padrões não correspondidos).(No
zsh
shell, você receberia um errofind
, pois ele não sabe qual opção-name "Bie*"
, ou seja, a string inteira , é; isso ocorre porque ozsh
shell não executa essas operações de divisão e glob em expansões não aspas por padrão.)Em vez disso, se você estiver usando um shell que possui arrays, use
Isso citaria adequadamente cada palavra individual quando usada
find
da maneira mostrada aqui.Ou você poderia ter usado
Relacionado:
Também a segunda metade da minha solução para definir -f dentro da função