Как я могу использовать псевдонимы команд с xargs? - PullRequest
26 голосов
/ 11 июня 2009

В моем .aliases есть следующий псевдоним:

alias gi grep -i

и я хочу искать foo без учета регистра во всех файлах, в имени которых есть строка bar:

find -name \*bar\* | xargs gi foo

Вот что я получаю:

xargs: gi: No such file or directory

Есть ли способ использовать псевдонимы в xargs, или я должен использовать полную версию:

   find -name \*bar\* | xargs grep -i foo

Примечание: Это простой пример. Помимо gi у меня есть несколько довольно сложных псевдонимов, которые я не могу так легко развернуть вручную.

Редактировать: Я использовал tcsh, поэтому, пожалуйста, укажите, является ли ответ специфичным для оболочки.

Ответы [ 6 ]

29 голосов
/ 11 июня 2009

Псевдонимы зависят от оболочки - в этом случае, скорее всего, от bash. Чтобы выполнить псевдоним, вам нужно выполнить bash, но псевдонимы загружаются только для интерактивных оболочек (точнее, .bashrc будет считываться только для интерактивной оболочки).

bash -i запускает интерактивную оболочку (и исходники .bashrc). bash -c cmd работает cmd .

Соберите их вместе: bash -ic cmd запускает cmd в интерактивной оболочке, где cmd может быть функцией / псевдонимом bash, определенной в .bashrc .

find -name \*bar\* | xargs bash -ic gi foo

должен делать то, что вы хотите.

Редактировать: Я вижу, вы пометили вопрос как "tcsh", поэтому решение, касающееся Bash, неприменимо. С tcsh вам не нужен -i, так как кажется, что он читает .tcshrc, если вы не дадите -f.

Попробуйте это:

find -name \*bar\* | xargs tcsh -c gi foo

Это сработало для моего базового тестирования.

7 голосов
/ 11 июня 2009

Вместо этого "gi" превращается в скрипт

например, в /home/$USER/bin/gi:

#!/bin/sh
exec /bin/grep -i "$@"

не забудьте пометить исполняемый файл.

6 голосов
/ 11 июня 2009

Предложение здесь состоит в том, чтобы избежать xargs и использовать цикл "while read" вместо xargs:

find -name \*bar\* | while read file; do gi foo "$file"; done

См. Принятый ответ в приведенной выше ссылке для уточнений в отношении пробелов или новых строк в именах файлов.

1 голос
/ 01 декабря 2016

Это специальный символьный сейф:

find . -print0 | xargs -0 bash -ic 'echo gi foo "$@"' --

-print0 и -0 используют строки, определенные \0 или NUL, поэтому вы не получите странных вещей, когда в именах файлов есть пробелы.

bash устанавливает первый аргумент после командной строки как $0, поэтому мы передаем ему фиктивный аргумент (--), чтобы первый файл в списке find не использовался $0 .

0 голосов
/ 19 июля 2010

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

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

(должно работать для tcsh аналогичным образом)

# alias definition in ~/.tcshrc
echo arg1 arg2 | xargs -n 1 tcsh -cim 'myFuncOrAlias "$1"' arg0  # untested
0 голосов
/ 11 июня 2009

Для tcsh (который не имеет функций) вы можете использовать:

gi foo `find -name "*bar*"`

Для bash / ksh / sh вы можете создать функцию в оболочке.

   function foobar 
   {
      gi $1 `find . -type f -name "*"$2"*"`
   }

   foobar foo bar

Помните, что использование обратных кавычек в оболочке более выгодно, чем использование xargs с разных точек зрения. Поместите функцию в ваш .bashrc.

...