2014-08-28 4 views
1

У меня есть 2 Баш функции catall и grepallфункция .bashrc реализации grepall

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

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 не sub'ed

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

ответ

2

Это происходит потому, что вы разветвление новый процесс оболочки используя 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 "" ' - {} \;; 
} 
+0

хорошего друг, как раз вовремя, чтобы посмотреть на расточные результаты испытаниях – dmc

+0

Пожалуйста, рад, что это сработало. – anubhava

+0

Возможно, вы захотите «отменить p», чтобы не загрязнять окружающую среду остальной части скрипта. Или сделайте временное присвоение env «find». -name "$ 1" | p = "$ 2" xargs -I% sh -c 'echo%; grep "$ p"%; echo "" '' - не забудьте процитировать '' $ 1 '' –

Смежные вопросы