2015-07-01 3 views
0

Признать псевдонимы в «xargs», я поставил псевдонимБаш псевдонимы в xargs: «Баш -c» не передавать аргументы команды

alias xargs="xargs bash -ic" 

Если я теперь выполнить ниже фрагмент кода, никаких аргументов не передается команде xargs.

find . -name pom.xml | xargs grep projectid 

Infact, никакие аргументы не передаются команде даже в этом случае.

bash -ic grep projectid pom.xml 

Документация Баш говорит

 
-c  If the -c option is present, then commands are read from the first non-option  
      argument command_string. If there are arguments after the command_string, they 
      are assigned to the positional parameters, starting with $0. 

Так что я делаю неправильно?

bash --version 
GNU bash, version 4.3.39(2)-release (x86_64-unknown-cygwin) 

UPDATE:
Благодаря @knittl для его входов. Находите решение, чтобы избежать всех дополнительных прерываний в ответе @ knittl.
1. Скачать xargs_bash_alias.sh
2. Установить псевдоним

alias xargs="<path>/xargs_bash_alias.sh" 

Теперь ваши команды xargs признают ваши другие Баши псевдонимов.

+0

'bash -c grep projectid pom.xml' выполняет команду' grep' и имеет позиционные аргументы '$ 0' (projectid) и' $ 1' (pom.xml'). Позиционные аргументы не используются вашей командой. – knittl

+0

Вы знаете, что '' $ * "' неправильно работает для многословных аргументов? – knittl

+0

Я не знаю об этом. Не баш-гуру. У вас есть предложение? –

ответ

1

Есть две вещи, о которых вам нужно знать. Во-первых, собственно процитировать:

find . -name pom.xml -print0 | xargs -0 bash -c "grep projectid" 

Во-вторых, вы должны передать свои позиционные аргументы как-то:

find . -name pom.xml -print0 | xargs -0 bash -c 'grep projectid "[email protected]"' - 

Использование - в качестве первого аргумента, чтобы колотить, так позиционные аргументы начинаются в $1, так же, как в нормальном shellscript.

"[email protected]" расширяет цитируемые позиционные аргументы, начиная с 1. Поскольку xargs проходит несколько аргументов сразу, вам необходимо либо использовать "[email protected]" (цит!) Внутри Баш скрипта или запустить xargs с опцией -n1.

+0

Тем не менее, в вашем примере вам вообще не нужен bash. Просто используйте простые xargs: 'find. -name pom.xml -print0 | xargs -0 grep projectid' – knittl

+0

Алиасы, установленные в bashrc, не распознаются xargs. поэтому мне нужно использовать «bash -ic». Прочтите это где-нибудь. –

+0

@KiranMohan: вы и я не используем псевдонимы внутри xargs. – knittl