2

Я хотел бы иметь возможность передать измененную команду grep в xargs. Я переопределяю команду с помощью функции в bash, аналогичной. Можно ли переопределить встроенную в командную строку команду "cd"? , Моя функция ниже работает, за исключением случаев перехода на xargs. Почему это и как мне обойти это?

переопределены:

function grepc() { $(which grep) -c "$@"; }

работает:

find -name '*.py' | grepc web
2

Xargs не удается:

find -name '*.py' | xargs grepc import
xargs: grepc: No such file or directory

(переход к xargs здесь должен grep содержимое файла списка python, который является странным надуманным примером, но суть в том, что xargs не может найти grepc)

TLDR: почему не может | xargs <function> работает? Действительно ли <function> должна быть <builtin> или чем-то еще?

2 ответа2

4

Что бы ни xargs , это его прямой дочерний процесс, между ними нет оболочки. xargs не имеет понятия о вашей функции. Он также не имеет понятия встроенных оболочек.

Чтобы это работало:

  • либо экспортируйте вашу функцию (с помощью команды export -f grepc) и xargs запустить оболочку несколько громоздким способом: … | xargs bash -c 'grepc "$@"' bash
  • или лучше преобразовать вашу функцию в скрипт, сделать файл исполняемым и поместить его туда, куда указывает ваш $PATH (или скорректировать переменную); тогда grepc будет файлом, и xargs сможет его запустить.
0

Еще один обходной путь, который пришел ко мне:

alias xg='xargs grep --color <or whatever else I want>'

Так как я использую эту комбинацию так часто.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .