2009-02-04 3 views
51

Я пытаюсь выполнить следующую команду:xargs не распознает Баш псевдонимы

find . -iname '.#*' -print0 | xargs -0 -L 1 foobar 

где «Foobar» является псевдоним или функции, определенным в моем файле .bashrc (в моем случае, это функция который принимает один параметр). Очевидно, xargs не распознает их как вещи, которые он может запустить. Есть ли разумный способ исправить это?

+1

Это одна из причин, почему я создаю скрипты на моем ~ папке/bin вместо создавая псевдонимы bash. Таким образом, я могу использовать свои псевдонимы из любой оболочки: BASH, ZSH, IPYTHON или FISH. – Yoo

+2

Вот аналогичный (хотя и не идентичный) вопрос: http: // stackoverflow.com/questions/979453/how-can-i-use-aliased-commands-with-xargs –

ответ

34

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

find . -iname '.#*' -print0 | while read -r -d '' i; do foobar "$i"; done 

Если вы уверены, что ваши имена файлов не имеют перевода строки в них (Ick, почему они?), Вы можете упростить это

find . -iname '.#*' -print | while read -r i; do foobar "$i"; done 

или даже просто find -iname '.#*' | ..., так как по умолчанию - ., а по умолчанию - -print. более

Одна альтернатива:

IFS=$'\n'; for i in `find -iname '.#*'`; do foobar "$i"; done 

говорил Bash, что слова только раскол по умолчанию символ новой строки (: IFS=$' \t\n'). Вы должны быть осторожны с этим; некоторые скрипты не очень хорошо справляются с измененным $IFS.

+1

Этот ответ отвечает, ПОЧЕМУ мы не можем использовать xargs и КАК мы можем использовать xargs с псевдонимом. –

+0

Этот ответ дает нам * альтернативы * использованию xargs. Для ответа, который работает * с использованием xargs *, см. Ответ @ camh в соответствующем вопросе: http://stackoverflow.com/questions/979453/how-can-i-use-aliased-commands-with-xargs (который Натан Феллман связанные выше) –

1

Я обычно использую найти так:

find . -iname '' -exec cmd '{}' \; 

'{}' получит заменяется именем, и \; необходимо для завершения цепочки выполнения. Однако, если это не работает с вашей функцией, вам может понадобиться запустить его через Баш:

find .. |sed -e "s/.*/cmd '&'/"|bash 

Поиск в печати каждый файл на линии, СЭД только префиксы это с вашей командой, а затем передать его колотить для выполнения. Пропустите сначала bash, чтобы узнать, что произойдет.

+0

Если вы используете новый GNU-поиск, используйте '-exec cmd '{}' +' вместо: это больше похоже на xargs в том, что он объединяет аргументы вместе в один проход вместо exec'ing нового cmd для каждого найденного файла. – ephemient

+0

Я скорее думаю, что если бы его функция была способна принимать несколько параметров, он бы не поставлял опции -L 1 для xargs ... – Alnitak

+0

О, вот что -Л делает? Я не смотрел, и я использую -n для этой цели. – ephemient

4

Это не работает, потому что xargs ожидает, чтобы иметь возможность exec программызаданной в качестве параметра.

С foobar в вашем случае есть только псевдоним или функция bash, нет программы для выполнения.

Хотя она включает в себя, начиная bash для каждого файла, возвращаемый find, вы могли бы написать небольшой скрипт таким образом:

#!/bin/bash 
. $(HOME)/.bashrc 
func $* 

, а затем передать имя этого сценария в качестве параметра xargs

+0

Где я должен разместить этот скрипт так, чтобы * it * был распознан 'xargs'? –

+0

@NickVolynkin, где бы вы ни захотели, если это либо в '$ PATH', либо передать его прямо в' xargs'. – Alnitak

+0

ОК, спасибо за объяснение. –

8

Использование Bash можно также указать количество аргументов, передаваемых на ваш псевдоним (или функции), например, так:

alias myFuncOrAlias='echo' # alias defined in your ~/.bashrc, ~/.profile, ... 
echo arg1 arg2 | xargs -n 1 bash -cil 'myFuncOrAlias "$1"' arg0 
echo arg1 arg2 | xargs bash -cil 'myFuncOrAlias "[email protected]"' arg0 

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

  • Нет связанных вопросов^_^