
Я хочу создать пользовательский встроенный bash
-- time
например, как. Возможно ли это? Если нет, возможно ли это в другой оболочке?
Например, я хочу сделать это: map find -name '*.js' | xargs grep func1
и запустить его find -name '*.js' | xargs grep func1
в каждом каталоге CWD. Обратите внимание, что всевключая трубупередается map
.
Цель — применить команду к нескольким каталогам. Я написал скрипт, который называется map
which eval
s $1
across what ls
produce. Однако, если команда, которую я хочу запустить, включает каналы, перенаправления и т. д., то мне придется заключать все внутри строки в кавычки. Я ищу способ не делать этого.
И мне просто интересно, возможно ли это ;)
решение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
в каждом подкаталоге текущего каталога.