Aqui está um comando que funciona perfeitamente para mim na linha de comando:
find . -type f -exec grep -Hin --include=*.h --include=*.c 'somestring' {} \;
Quando executo o comando acima substituindo o caminho de pesquisa .
por qualquer caminho, o comando ainda me mostra apenas a lista de arquivos com .c
ou .h
extensão.
Agora, quero escrever um script bash simples com o mesmo comando que o valor de uma variável, apenas para poder executar o script com pequenas modificações para fazer uma pesquisa semelhante, em vez de ter que digitar o comando novamente. Mas é aí que me deparo com o pesadelo das regras de fuga (ou falta de compreensão adequada disso!).
Eu escrevi um script como mostrado abaixo:
#!/bin/bash
path="/home/vinod"
string="somestring"
command="find ${path} -type f -exec grep -Hin --include=*.h --include=*.c '${string}' {} \;"
echo $command
$command
Quando executo o script acima, recebo o comando repetido duas vezes em vez de uma vez, conforme mostrado abaixo
find . -type f -exec grep -Hin --include=*.h --include=*.c 'somestring' {} \;
find . -type f -exec grep -Hin --include=*.h --include=*.c 'somestring' {} \;
e o seguinte erro em tempo de execução:
find: missing argument to -exec
Como você pode ver no eco, o comando é exatamente o mesmo de quando o executei na linha de comando, para o qual obtive o resultado esperado.
Quaisquer pensamentos sobre o que poderia estar errado com o meu script?
TIA
Não use uma variável para armazenar um comando . Em vez disso, use variáveis para armazenar dados e funções para armazenar (definir) comandos.
Podemos criar um comando que receba dois parâmetros: um caminho de pesquisa inicial e uma string de pesquisa.
Você poderia modificá-lo trivialmente para obter apenas um padrão de pesquisa se o caminho de pesquisa inicial também fosse corrigido. Na verdade, vamos inverter a ordem dos parâmetros e dizer que, se o caminho de pesquisa for omitido, o padrão será o seu
$HOME
diretório:Salve-o como o arquivo
chfind
, torne-o executável (chmod a+rx chfind
) e coloque-o em algum lugar do seu arquivo$PATH
. Agora você pode usá-lo como qualquer outro utilitário:Como não usamos
grep -F
a string de pesquisa, ela é, na verdade, uma expressão regular em vez de uma string simples, portanto, procurar por uma declaração comoFILE *fp
não funcionará.Por fim, se você quiser que os nomes dos caminhos sejam relativos ao seu caminho de pesquisa, poderá alterar o diretório para o
$path
e pesquisar a partir daí:Talvez valha a pena explicar como isso pode ser obtido com uma função em vez de em linha no script. Abordei seu requisito subjacente (" Quero escrever um script bash simples [...] para que eu possa executar o script [...] para fazer uma pesquisa semelhante, em vez de ter que digitar o comando novamente") . Mas se você quiser usar uma função, é quase exatamente o mesmo: