Problema com localização e variáveis

2

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

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

Também me disseram que não teria acesso a rgrep em algumas caixas em que estarei trabalhando e, portanto, tentei essa abordagem para uma solução genérica para aplicar 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'
    
por xtapodi 05.04.2012 / 20:30

1 resposta

4

O padrão que você provavelmente pretendia usar era *.txt , mas está dizendo find -name para 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ê o '*.txt' como cotação, por isso, ele retira as cotas e transmite o conteúdo, *.txt , para find .

Na função ,

find -name "'$var'"

o shell expande $var para *.txt . Como a expansão ocorreu entre aspas duplas, o shell retira aspas duplas e transmite o conteúdo, '*.txt' , para find .

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

Eu retomei 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 "$@"
}     
    
por 05.04.2012 / 21:08

Tags