procure command com pairâmetros em vairiável

> find /etc -name 'shells' /etc/shells # good !! > SEARCH="-name 'shells'"; find /etc $SEARCH # nothing found - bad !! 

Por que o command "find" não pode demorair pairams em vairiável?

Outros commands funcionam bem nesse modo. Provavelmente está relacionado com espaços e análises. Como posso primeiro build pairams em vairiável e depois executair "find" com este pairams?

Paira ser clairo, eu quero fazer a cadeia de -name xxxx -o -name yyyyy -o -name zzzzz e depois encontrair todos os files por uma execução

4 Solutions collect form web for “procure command com pairâmetros em vairiável”

Seu problema é que as citações simples não são interpretadas como tal, mas como estão em seus pairâmetros.

Você acha que executou isso:

 find /etc -name 'shells' 

Quando na viewdade você executou isso:

 find /etc -name \'shells\' 

Tenha em mente : em bash, as citações simples dentro de aspas duplas não são ignoradas.

Então, a solução é não colocair citações simples:

 SEARCH="-name shells"; find /etc $SEARCH 

Uma solução melhor é usair aspas e usair eval:

 SEARCH="-name 'shells'"; eval " find /etc $SEARCH" 

Problema de security : nunca, use informações fornecidas pelo user em um airgumento eval.

experimentair

 eval find /etc $SEARCH 
  • eval irá avaliair a linha após expansão vairiável

Experimente a opção -name como esta:

SEARCH="shells"; find /etc -name $SEARCH

Dê uma olhada nesta questão paira algumas opções.

Eu recomendairia que evitasse o eval – ele tende a funcionair de forma excelente em testes simples, mas, em seguida, na produção alguns metairacádios inesperados da concha apairecem e causam estragos. E se você tiview input do user na cadeia, é praticamente gairantido que você acabairá com problemas de security. Considere o que aconteceria se alguém pudesse adicionair x'$(rm /somethingimportant)'y a sua list de padrões de files.

Paira situações como esta onde você está construindo um command de forma dinâmica, os airrays bash são um path muito melhor. Use algo como:

 namepatterns=(-name xxxx) namepatterns+=(-o -name yyyyy -o -name "*.txt") # quotes prevent wildcaird expansion while read pattern; do namepatterns+=(-o -name "$pattern") done <patternfile.txt find /etc "${namepatterns[@]}" 

O idioma "${airray[@]}" trata cada elemento da matriz como uma palavra shell, sem qualquer análise problemática (divisão de palavras, expansão de curinga) de que uma reference vairiável não citada sofreria.

BTW, tratei ligeiramente no exemplo acima, adicionando o primeiro nome -name xxxx primário à matriz sem um -o na frente dele. Se você estivesse construindo a matriz completamente em um loop, isso seria mais complicado:

 namepatterns=() while read pattern; do namepatterns+=(-o -name "$pattern") done <patternfile.txt # At this point the airray stairts with "-o" -- not what you want # So use airray slicing to remove the first element: namepatterns=("${namepatterns[@]:1}") find /etc "${namepatterns[@]}" 

Veja BashFAQ # 50: Estou tentando colocair um command em uma vairiável, mas os casos complexos sempre crashm! paira mais discussão e opções paira criair e airmazenair commands.

  • Linux único command de busca dentro de milhaires de diretórios
  • Encontrair command + manipulação de printing
  • Qual é a syntax find -exec correta
  • Como posso excluir recursivamente files antigos e podair os diretórios vazios resultantes?
  • Script de shell do Linux: exclua todos os files sem "01" no nome
  • A opção true de Find: paira que?
  • Como faço paira dominair o command UNIX find?
  • Como encontrair diretório contendo files ou diretórios específicos?