bash custom builtin

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

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

Цель состоит в том, чтобы применить команду к нескольким каталогам. Я написал сценарий, называемый map который eval $1 за все, что производит ls . Однако, если команда, которую я хочу запустить, включает в себя каналы, перенаправления и т. Д., Тогда я должен процитировать все внутри строки. Я ищу способ не делать этого.

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

  • Какое правильное имя для команды «>»
  • Преобразовать ключ = значения в CSV
  • Есть ли команда, которая создает временный файл, содержащий переданные ему аргументы?
  • Вставить «файл cat» в данные CURL
  • Что такое символ или символ, и каково его значение вне форматирования кода SE?
  • Преобразование MAC-адреса в локальный адрес ссылки с помощью bash
  • Безопасно ли выполнять эти инструкции в качестве пользователя root?
  • Кто является владельцем файла, если файл создан с помощью команды sudo?
  • 2 Solutions collect form web for “bash custom builtin”

    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 ]] || ' 

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

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

     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 в каждом подкаталоге текущего каталога.

    Linux и Unix - лучшая ОС в мире.