Problema com localização e variáveis

Problema com localização e variáveis

Eu tentei diferentes variações do seguinte, mas nada parece funcionar. Basicamente, quando findé executado, nada parece acontecer. Abaixo apresento meu código de função bash e minha saída quando o executo.

Estou interessado em entender o que acontece com o código abaixo e por que ele não se comporta como quando digito o comando explicitamente.

Também me disseram que não terei acesso a rgrepalgumas caixas nas quais estarei trabalhando e, portanto, tento esta abordagem para uma solução genérica para obter código, etc.

function findin() {

if [ -z $1 ] ; then

    echo "Usage: findin <file pattern> <<grep arguments>>"
    return 1

fi

fIn[1]=$1

shift
fIn[2]="$@"

echo -- "${fIn[1]}"
echo -- "'${fIn[2]}'"

find -type f -name "'${fIn[1]}'" -print0 | xargs -0 grep --color=auto ${fIn[2]}
}

E a saída é:

$ ls
Server.tcl  Server.tcl~  test.cfg  vimLearning.txt
$ find -type f -name '*.txt' -print0 | xargs -0 grep --color=auto char
x      deletes char under cursor. NNx deletes NN chars to RHS of cursor.
r      type r and the next char you type will replace the char under the cursor.
$ findin '*.txt' char
-- *.txt
-- 'char'

Responder1

O padrão que você provavelmente pretendia usar era *.txt, mas você está dizendo find -namepara usar '*.txt', incluindo as aspas simples, que não correspondem a nenhum arquivo. A expansão funciona da seguinte forma:

Na linha de comando, quando você digita

$ find -name '*.txt'

seu shell vê '*.txt'que está entre aspas, então ele remove as aspas e passa o conteúdo, *.txt, para find.

Na função,

find -name "'$var'"

o shell se expande $varpara *.txt. Como a expansão ocorreu entre aspas duplas, o shell remove as aspas duplas e passa o conteúdo, '*.txt', para find.

A solução é simples: remova as aspas simples do arquivo find -name "'$var'".


Retoquei sua função para você:

findin () {
    if (( $# < 2 )); then
        >&2 echo "Usage: findin <file pattern> <grep arguments ...>"
        return 1    
    fi               
    pattern=$1               
    shift
    printf '%s\n' "-- ${pattern}"
    printf '%s ' "-- $@"
    echo
    find -type f -name "${pattern}" -print0 | 
            xargs -0 grep --color=auto "$@"
}     

informação relacionada