Para reconocer alias en "xargs", he establecido un alias
alias xargs="xargs bash -ic"
Si ahora ejecuto el siguiente fragmento de código, no se pasan argumentos al comando a xargs.
find . -name pom.xml | xargs grep projectid
De hecho, no se pasan argumentos al comando ni siquiera en este caso.
bash -ic grep projectid pom.xml
La documentación para bash dice
-c Si la opción -c está presente, entoncesLos comandos se leen desde la primera no-opción. argumento command_string. Si hay argumentos después de la cadena de comandos, se asignan a los parámetros posicionales, comenzando con $ 0.
Entonces, ¿qué estoy haciendo mal?
bash --version
GNU bash, version 4.3.39(2)-release (x86_64-unknown-cygwin)
ACTUALIZAR:
Gracias a @knittl por sus aportaciones. Una solución de trabajo por ahora para evitar todas las puntuaciones adicionales en la respuesta de @knittl.
1. Descargar xargs_bash_alias.sh
2. Establecer un alias
alias xargs="<path>/xargs_bash_alias.sh"
Ahora sus comandos xargs reconocerían sus otros alias de bash.
Respuestas
1 para la respuesta № 1Hay dos cosas que debes tener en cuenta. En primer lugar, citar correctamente:
find . -name pom.xml -print0 | xargs -0 bash -c "grep projectid"
Segundo, necesitas pasar tus argumentos posicionales de alguna manera:
find . -name pom.xml -print0 | xargs -0 bash -c "grep projectid "$@"" -
Utilizar -
como primer argumento para golpear, entonces los argumentos posicionales comienzan en $1
, al igual que en un shellscript normal.
"$@"
se expande a los argumentos posicionales citados a partir de 1. Dado que xargs pasa varios argumentos a la vez, debe usar "$@"
(¡citado!) dentro de su script de bash o ejecute xargs con el -n1
opción.