Проблема с поиском и переменными

Проблема с поиском и переменными

Я пробовал разные варианты следующего, но ничего не работает. В основном, когда findgets выполняется, ничего не происходит. Ниже я представляю свой код функции bash и мой вывод при ее запуске.

Мне интересно понять, что происходит с приведенным ниже кодом и почему он ведет себя не так, как если бы я ввел команду явно.

Мне также сказали, что у меня не будет доступа к rgrepнекоторым ящикам, над которыми я буду работать, поэтому я пробую этот подход в качестве универсального решения для поиска кода и т. д.

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]}
}

И вот что получается:

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

решение1

Шаблон, который вы, вероятно, намеревались использовать, был *.txt, но вы говорите find -nameиспользовать '*.txt', включая одинарные кавычки, что не соответствует ни одному файлу. Расширение работает следующим образом:

В командной строке, когда вы печатаете

$ find -name '*.txt'

ваша оболочка видит, '*.txt'что кавычки заключены в кавычки, поэтому она удаляет кавычки и передает содержимое, *.txt, в find.

В функции,

find -name "'$var'"

оболочка расширяется $varдо *.txt. Поскольку расширение произошло в двойных кавычках, оболочка удаляет двойные кавычки и передает содержимое, '*.txt', в find.

Решение простое: удалите одинарные кавычки в find -name "'$var'".


Я подправил вашу функцию для вас:

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

Связанный контент