встроенный пользовательский bash

встроенный пользовательский bash

Я хочу создать пользовательский встроенный bash-- timeнапример, как. Возможно ли это? Если нет, возможно ли это в другой оболочке?

Например, я хочу сделать это: map find -name '*.js' | xargs grep func1и запустить его find -name '*.js' | xargs grep func1в каждом каталоге CWD. Обратите внимание, что всевключая трубупередается map.

Цель — применить команду к нескольким каталогам. Я написал скрипт, который называется mapwhich evals $1across what lsproduce. Однако, если команда, которую я хочу запустить, включает каналы, перенаправления и т. д., то мне придется заключать все внутри строки в кавычки. Я ищу способ не делать этого.

И мне просто интересно, возможно ли это ;)

решение1

ATT ksh, bash и zsh имеют динамическую систему загрузки модулей, которая позволяет загружать дополнительный код в существующий экземпляр оболочки, а динамически загруженный код может реализовывать новые встроенные функции. Однако то, о чем вы просите, требует большего, чем просто новую встроенную функцию: для этого требуется новый синтаксис, и я думаю, что ни одна из оболочек не сможет с этим справиться. Вам придется изменить парсер в исходном коде оболочки.

В zsh вы можете получить синтаксис, близкий к желаемому:

for x (*/) (cd $x && pipeline)

Вы можете создать псевдоним alias map='for x (*/) (cd $x &&', но вам все равно нужна закрывающая скобка в конце. Вы можете получить именно тот синтаксис, который вам нужен, с помощью грубого хака:

alias map='map__PWD=$PWD; for x (./*/ "") cd $map__PWD${x#.}/ && [[ -z $x ]] || '

Это так уродливо, хрупко и не поддается обобщению, что я не собираюсь это объяснять. Не думайте об использовании этого, если вы не полностью понимаете, как это работает.

решение2

В этом случае, что-то вроде

find . -type f -name "*.js" -exec grep -qF "func1" {} \; -print

вероятно, будет достаточно, чтобы найти имена файлов *.jsв любом месте текущего каталога или ниже, которые содержат строку func1.

Если вы хотите избежать файлов, находящихся в текущем каталоге:

find . -mindepth 2 -type f -name "*.js" -exec grep -qF "func1" {} \; -print

При использовании -mindepth 2не findбудет найдено ничего на «глубине 1», т.е. в текущем каталоге.

Последнее, в принципе, делает то, о чем вы просите. Оно эффективно работает grepв каждом подкаталоге текущего каталога.

Связанный контент