Функция.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 "" ' - {} \;;
}