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.