Функция.bashrc, реализующая grepall

У меня есть 2 функции Bash Catall и Grepall

catall работает нормально, перебирает каждый найденный файл, сначала печатается имя файла, затем содержимое и новая строка

catall ()
{
  find . -name $1 | xargs -I % sh -c 'echo %; cat %; echo"" '
}


grepall ()
{
  find . -name $1 | xargs -I % sh -c 'echo %; cat % | grep $2; echo"" '
}

Но grepall не работает, должен делать то же самое, что и catall но с этапом grep по содержимому файла

Почему $2 не подчинены

Можете ли вы сделать эту работу Grepall?

1 ответ

Решение

Это потому, что вы создаете новый процесс оболочки, используя sh -c и все переменные родительской оболочки недоступны в дочерней оболочке, если вы не экспортируете их.

Используйте эту функцию, чтобы она работала:

grepall () {
   export p="$2"; find . -name $1 | xargs -I % sh -c 'echo %; grep "$p" %; echo "" ';
}

Теперь это работает, потому что мы создаем экспортируемую переменную p который становится доступным в суб-оболочке также.

Так как вы в любом случае разветвляете новую оболочку, вам не нужно xargsa как find можем сделать работу за вас:

grepall () {
   export p="$2"; find . -name $1 -exec sh -c 'echo $1; grep "$p" $1; echo "" ' - {} \;;
}
Другие вопросы по тегам