bash personalizado incorporado

bash personalizado incorporado

Quiero crear una función integrada personalizada bash, como timepor ejemplo. es posible? Si no es así, ¿es posible en otro caparazón?

Por ejemplo, quiero hacer esto: map find -name '*.js' | xargs grep func1y ejecutarlo find -name '*.js' | xargs grep func1dentro de cada directorio dentro de CWD. Note que todoincluyendo la tuberíase pasa a map.

El objetivo es aplicar un comando en varios directorios. Escribí un guión llamado " mapcuál evales $1todo lo que lsproduce". Sin embargo, si el comando que quiero ejecutar incluye canalizaciones, redirecciones, etc., entonces tengo que citar todo dentro de una cadena. Estoy buscando una manera de no tener que hacer eso.

Además, tengo curiosidad por saber si esto es posible;)

Respuesta1

ATT ksh, bash y zsh tienen cada uno un sistema de carga de módulos dinámicos que permite cargar código adicional en una instancia de shell existente, y el código cargado dinámicamente puede implementar nuevas funciones integradas. Sin embargo, lo que estás pidiendo requiere más que una nueva integración: requiere una nueva sintaxis, y creo que ninguno de los shells puede manejar eso. Tendría que modificar el analizador en el código fuente del shell.

En zsh, puedes acercarte a la sintaxis que deseas:

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

Puedes crear un alias alias map='for x (*/) (cd $x &&'pero aún necesitas el paréntesis de cierre al final. Puedes obtener exactamente la sintaxis que deseas con un truco asqueroso:

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

Esto es tan feo, frágil y no generalizable que no voy a explicarlo. No pienses en usarlo si no entiendes completamente cómo funciona.

Respuesta2

En este caso, algo como

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

Probablemente sería suficiente encontrar los nombres de los *.jsarchivos en cualquier lugar dentro o debajo del directorio actual que contenga la cadena func1.

Si desea evitar los archivos que están en el directorio actual:

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

Con -mindepth 2, findno coincidirá con nada en la "profundidad 1", es decir, en el directorio actual.

Esto último básicamente hace lo que pides. Se ejecuta efectivamente grepen cada subdirectorio del directorio actual.

información relacionada