command-line xargs bash

command line - xargs no reconoce los alias de bash



xargs windows (4)

Esto no funciona porque xargs espera poder exec el programa dado como su parámetro.

Como foobar en su caso es solo un alias o función bash no hay programa para ejecutar.

Aunque implica iniciar bash para cada archivo devuelto por find , puede escribir un pequeño script de shell de esta manera:

#!/bin/bash . $(HOME)/.bashrc func $*

y luego pasar el nombre de esa secuencia de comandos como el parámetro para xargs

Estoy tratando de ejecutar el siguiente comando:

find . -iname ''.#*'' -print0 | xargs -0 -L 1 foobar

donde "foobar" es un alias o función definida en mi archivo .bashrc (en mi caso, es una función que toma un parámetro). Aparentemente, xargs no los reconoce como cosas que puede ejecutar. ¿Hay alguna forma inteligente de remediar esto?


Suelo usarlo así:

find . -iname '''' -exec cmd ''{}'' /;

''{}'' se reemplazará con el nombre del archivo y /; es necesario para terminar la cadena de ejecución. Sin embargo, si eso no funciona con su función, es posible que deba ejecutarla a través de bash:

find .. |sed -e "s/.*/cmd ''&''/"|bash

Buscar imprime cada archivo en una línea, sed solo lo antepone a su orden y luego canaliza a bash para su ejecución. Omita el | bash primero para ver qué pasará.


Usando Bash también puede especificar el número de argumentos que se pasan a su alias (o función) de la siguiente manera:

alias myFuncOrAlias=''echo'' # alias defined in your ~/.bashrc, ~/.profile, ... echo arg1 arg2 | xargs -n 1 bash -cil ''myFuncOrAlias "$1"'' arg0 echo arg1 arg2 | xargs bash -cil ''myFuncOrAlias "$@"'' arg0


Como solo su caparazón interactivo conoce alias, ¿por qué no ejecuta el alias sin bifurcar a través de xargs ?

find . -iname ''.#*'' -print0 | while read -r -d '''' i; do foobar "$i"; done

Si está seguro de que sus nombres de archivo no tienen nuevas líneas en ellos (ick, ¿por qué lo harían?), Puede simplificar esto para

find . -iname ''.#*'' -print | while read -r i; do foobar "$i"; done

o incluso acaba de find -iname ''.#*'' | ... find -iname ''.#*'' | ... , ya que el directorio predeterminado es . y la acción predeterminada es -print .

Una alternativa más:

IFS=$''/n''; for i in `find -iname ''.#*''`; do foobar "$i"; done

diciéndole a Bash que las palabras solo se dividen en líneas nuevas (por defecto: IFS=$'' /t/n'' ). Sin embargo, debes tener cuidado con esto; algunos scripts no soportan bien un $IFS cambiado.