Problema con búsqueda y variables.

Problema con búsqueda y variables.

He probado diferentes variaciones de lo siguiente pero nada parece funcionar. Básicamente, cuando findse ejecuta, parece que no sucede nada. A continuación presento el código de mi función bash y mi resultado cuando lo ejecuto.

Estoy interesado en entender qué sucede con el código siguiente y por qué no se comporta como cuando escribo el comando explícitamente.

También me dijeron que no tendré acceso a rgrepalgunos cuadros en los que estaré trabajando y, por lo tanto, pruebo este enfoque para obtener una solución genérica para buscar 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]}
}

Y la salida es:

$ 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'

Respuesta1

El patrón que probablemente pretendías usar era *.txt, pero estás indicando find -nameque lo uses '*.txt', incluidas las comillas simples, que no coinciden con ningún archivo. La ampliación funciona de la siguiente manera:

En la línea de comando, cuando escribes

$ find -name '*.txt'

su shell ve '*.txt'que está entrecomillado, por lo que elimina las comillas y pasa el contenido, *.txta find.

en la funcion,

find -name "'$var'"

el caparazón se expande $vara *.txt. Dado que la expansión se produjo entre comillas dobles, el shell elimina las comillas dobles y pasa el contenido, '*.txt'a find.

La solución es simple: elimine las comillas simples en find -name "'$var'".


Te retoqué tu función:

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 "$@"
}     

información relacionada