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 .

  • Предотвращение доступа SIGINT к дочерним процессам
  • Повторная команда с другим параметром
  • Как найти md5sum файлов на удаленных машинах, выполнив ssh?
  • Как поймать ошибку в сценарии linux bash?
  • Есть ли команда unix, которая дает минимум / максимум двух чисел?
  • Массив Bash, объявленный в функции, недоступен вне функции
  • Цель состоит в том, чтобы применить команду к нескольким каталогам. Я написал сценарий, называемый map который eval $1 за все, что производит ls . Однако, если команда, которую я хочу запустить, включает в себя каналы, перенаправления и т. Д., Тогда я должен процитировать все внутри строки. Я ищу способ не делать этого.

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

  • Скопировать новейший файл в каталог через SSH
  • Синтаксическая ошибка в точке с запятой в сценарии оболочки
  • Как связать номер строки с файлом в файл результатов выходного файла diff?
  • Как я могу создать новые команды оболочки?
  • Bash ждет рабочих мест и ограничивает количество заданий
  • Завершение SSH, вызванное скриптом (обработка SIGPIPE?)
  • 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 - лучшая ОС в мире.